2017-10-21 6 views
2

私は、np.nansumのような機能を使用して既存のデータフレームからサブデータフレームを作成するための助けを探しています。 「ダン」(T-2,3,4,6,7) - nullでない場合、例えば、パンダクロス集計マトリックスnansum

dan ste bob 
t1 na 2 na 
t2 2 na 1 
t3 2 1 na 
t4 1 na 2 
t5 na 1 2 
t6 2 1 na 
t7 1 na 2 

の合計:私は非ヌル列和のマトリックス中にこのテーブルを変換します「STEは」2であると「ボブ」は「STEは」 'ダンのないヌル和である場合は5です。4.

dan ste bob 
dan 0 2 5 
ste 4 0 2 
bob 4 1 0 

任意のアイデアですか?

ありがとうございます!

私は、下記のマットの機能の修正版使用して終了:あなたのデータフレームは、多数の列を持っていない、この関数は、あなたがやりたいことと、かなりパフォーマンスであるべきと仮定すると、

def nansum_matrix_create(df): 
    rows = [] 
    for col in list(df.columns.values): 

     col_sums = df[df[col] != 0].sum() 
     rows.append(col_sums) 

    return pd.DataFrame(rows, columns=df.columns, index=df.columns) 
+1

これはクロスタブでもドットプロダクトでもなく、実際にはナンサムでもないとは思いません。 –

答えて

0

を。私はfor列を使用してこれを実装しているので、そこにはより良い/エレガントなソリューションがあるかもしれません。

import pandas as pd 

# Initialise dataframe 
df = {"dan":[pd.np.nan,2,2,1,pd.np.nan,2,1], 
     "ste":[2,pd.np.nan,1,pd.np.nan,1,1,pd.np.nan], 
     "bob":[pd.np.nan,1,pd.np.nan,2,2,pd.np.nan,2]} 
df = pd.DataFrame(df)[["dan","ste","bob"]] 

def matrix_create(df): 
    rows = [] 
    for col in df.columns: 
     subvals, index = [], [] 
     for subcol in df.columns: 
      index.append(subcol) 
      if subcol == col: 
       subvals.append(0) 
      else: 
       subvals.append(df[~pd.isnull(df[col])][subcol].sum()) 

     rows.append(subvals) 

    return pd.DataFrame(rows,columns=df.columns,index=index) 

matrix_create(df) 
+0

ありがとうMatt - あなたのスクリプトでいくつかのパフォーマンス上の問題に遭遇しましたが、少し修正しました。 –

+0

デフnansum_matrix_create(DF): 行= []リストにおけるCOLため (df.columns.values): col_sums =のDF [] COL [DF = 0!] .SUM() rows.append(col_sums) return pd.DataFrame(rows、columns = df.columns、index = df.columns) –

1
  1. 非ヌルがどこにあるかを取得するpd.DataFrame.notnullを使用してください。
  2. 次に、pd.DataFrame.dotを使用してクロス集計を実行します。
  3. 最後に、np.eyeを使用して対角をゼロにします。

df.notnull().T.dot(df.fillna(0)) * (1 - np.eye(df.shape[1])) 

    dan ste bob 
dan 0.0 2.0 5.0 
ste 4.0 0.0 2.0 
bob 4.0 1.0 0.0 

注:
私は私の値が数値だったことを確認するためにこれを使用していました。

df = df.apply(pd.to_numeric, errors='coerce') 
+0

これは問題の美しい解決策です! – Matt

+0

これを自分のデータでテストしたところ、列のすべてのセルで同じ合計が計算されました。 –

+0

あなたの '' na''文字列はありますか?それとも、値がヌルですか?それらが文字列の場合は、私の答えの** 'note:' **セクションのコードを使用する必要があります。それ以外の場合は、実際のデータの一部を見る必要があります。 – piRSquared