熊猫交叉表矩阵点nansum

问题描述:

我正在寻找帮助创建从现有数据帧使用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。 –

假设你的数据帧不具有大量列的,这个功能应该做你想要什么,是相当高性能的。我已经在列上使用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. 使用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