首页 > 解决方案 > 获取所有列对之间具有非 na 值的“周期”数的矩阵(联合计数)

问题描述

Pandas 具有分别生成相关矩阵和协方差矩阵的.corr()和函数。.cov()可以传递min_periods=<some int>给它们中的任何一个,以产生NaN任何列对的相关性或协方差,这些列对在两列中都具有非 nan 值的行太少。我寻求生成矩阵的最佳方法,该矩阵给出所有列对中共享非 nan 数值的实际数量。

例如:

设置

pd.np.random.seed(42)
df = pd.DataFrame(pd.np.random.randn(20, 3),
                  columns=['a', 'b', 'c'])
df.loc[df.index[:5], 'a'] = pd.np.nan
df.loc[df.index[5:10], 'b'] = pd.np.nan

我希望得到一个counts_df,例如:

    a   b   c
a  15  10  15
b  10  15  15
c  15  15  20

我可以使用以下代码做到这一点:

counts = []
for i in df.columns:
    for j in df.columns:
        counts.append((i, j, df[[i, j]].dropna().count().iloc[0]))
counts_df = pd.DataFrame(counts, columns=['i', 'j', 'count']).set_index(['i', 'j']).unstack()

不用说,代码至少完成了两倍的工作,但这不是重点。这可能不是一个好的解决方案。对于大型数据集(1000+ 列和 100 行),即使.corr()在同一帧上的实例中运行,该代码也非常慢。我对这种情况并不感到惊讶,但是,我还没有想出让熊猫生成“计数矩阵”的方法。用熊猫生成这样一个计数矩阵的聪明/好/干净/快速的方法是什么?可能有一些内置的东西我只是没有想过......

标签: pythonpandasnumpystatistics

解决方案


>>> tmp = df.notna().astype(int)
>>> counts_df = tmp.T.dot(tmp)
>>> counts_df
    a   b   c
a  15  10  15
b  10  15  15
c  15  15  20

推荐阅读