【问题标题】:Pandas crosstab matrix dot nansumPandas 交叉表矩阵点 nansum
【发布时间】:2018-04-02 19:22:46
【问题描述】:

我正在寻求帮助,使用类似 np.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

例如,当 'dan' 不为空 (t-2,3,4,6,7) 时,'ste' 的和为 2,'bob' 为 5。当 'ste' 不为空时'dan'的总和是4。

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

有什么想法吗?

提前致谢!

我最终在下面使用了 matt 函数的修改版本:

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)

【问题讨论】:

  • 这既不是交叉表,也不是点积,我也不确定它是否是 nansum。

标签: python pandas matrix nan


【解决方案1】:

假设你的数据框没有大量的列,这个函数应该做你想做的事情并且性能相当好。我已经使用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): 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)
【解决方案2】:
  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')

【讨论】:

  • 这是解决问题的绝妙方法!
  • 当我对我的数据进行测试时,它计算了列中每个单元格的相同总和。
  • 你的'na'是字符串吗?还是它们为空值?如果它们是字符串,您必须使用我回答的 note: 部分中的代码。否则,我需要查看您的部分真实数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2017-02-08
  • 2022-11-13
相关资源
最近更新 更多