python - 获取所有列对之间具有非 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()
在同一帧上的实例中运行,该代码也非常慢。我对这种情况并不感到惊讶,但是,我还没有想出让熊猫生成“计数矩阵”的方法。用熊猫生成这样一个计数矩阵的聪明/好/干净/快速的方法是什么?可能有一些内置的东西我只是没有想过......
解决方案
>>> 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
推荐阅读
- javascript - 我怎样才能获得特定收音机的价值
- indexing - WordDelimiterGraphFilterFactory 的 Solr 短语查询问题
- rxjs - 在 Redux Observable 中,如何在 img 加载后获取图像大小
- dart - 在 Dart 中检测动态类型
- arrays - 将一维数组重塑为网格格式
- typo3 - TYPO3 9.2.1 在 Composer 模式下创建 ViewHelper
- angular - 在 typescript [ionic angular] 中执行 resolveLocalFilesystemUrl 后无法获取文件数据
- android - 如何在gradle中声明一个变量?
- mysql - 1615 准备好的语句需要在codeigniter中重新准备
- react-native - 反应原生火力。getInitialNotification 为空