熊猫交叉表矩阵点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)
假设你的数据帧不具有大量列的,这个功能应该做你想要什么,是相当高性能的。我已经在列上使用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)
谢谢Matt - 我遇到了脚本的一些性能问题,但我稍微修改了它,现在它运行的很好! –
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) –
- 使用
pd.DataFrame.notnull
获得其中非空值。 - 然后使用
pd.DataFrame.dot
来创建交叉表。 - 最后,使用
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')
这是一个美丽的解决方案! – Matt
当我在我的数据上进行测试时,它在一列中的每个单元格中计算出相同的总和。 –
你的na''琴弦?或者他们为空值?如果它们是字符串,则必须在我的答案的** note:**部分中使用代码。否则,我需要查看一些真实数据的一部分。 – piRSquared
这既不是一个交叉标签,也不是一个dot产品,我也不确定它是否是nansum。 –