2017-10-21 138 views
2

我正在尋找幫助創建從現有數據幀使用np.nansum-like函數的子數據幀。我想該錶轉換成非空列總和的矩陣:熊貓交叉表矩陣點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 

例如,當「丹」不是空(叔2,3,4,6,7)的總和「STE」爲2和「鮑勃」是5。當「STE」不是空的「丹」的總和爲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

這既不是一個交叉標籤,也不是一個dot產品,我也不確定它是否是nansum。 –

回答

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

DEF nansum_matrix_create(DF): 行數= [] 在列表山口(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
  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