Pandas:每行前N个非缺失值的和
我想高效地计算一个pandas数据框中前N个非缺失值的总和。
比如说,如果我有一个这样的数据框:
"df"
sid 1900 1899 332 855 1285 1413 1063 1768 2320 1117
bid
309 -0.02 -0.03 -0.03 -0.02 NaN -0.01 9.81e-04 -0.02 -0.02 1.25e-02
470 -0.02 -0.04 NaN -0.02 -0.04 -0.02 -2.48e-02 -0.02 -0.02 NaN
818 NaN NaN NaN NaN NaN NaN -3.87e-02 NaN NaN -2.54e-02
1080 NaN NaN NaN NaN NaN NaN -3.61e-02 0.08 NaN NaN
1292 0.06 0.08 -0.01 -0.01 -0.04 0.01 4.85e-02 NaN 0.00 2.72e-02
1449 -0.02 0.00 NaN NaN -0.04 NaN NaN -0.02 -0.00 -5.85e-04
2253 -0.03 -0.04 -0.04 -0.03 NaN -0.02 -4.12e-02 -0.02 -0.03 -2.51e-02
2441 NaN -0.04 -0.03 -0.02 NaN -0.02 -4.19e-02 -0.02 -0.03 -2.68e-02
如果我想要计算每一行前3个非缺失值的总和,我可以像这样遍历数据框:
row_sum = np.zeros(len(df))
for i, index in enumerate(df.index):
row_sum[i]=df.ix[index].dropna()[:3].sum()
不过,这样做效率不是特别高。我希望能有一种向量化的方法。我尝试了很多不同的方式来处理数据框或者底层数组(df.values),但还没有找到有效的解决方案。
我有点担心我可能漏掉了什么明显的东西。
注意:如果某一行的非缺失值少于N个也是可以的。我只想要每行最多N个值。
2 个回答
1
不确定这样做是否更快,但一种更“灵活”的方法可能是这样的:
def sum_first_n(row,n):
return row.dropna()[:n].sum()
df.apply(sum_first_n, n=3, axis = 1)
这样做会返回一个和你原始数据表(dataframe)有相同索引的序列。
3
我觉得你可以直接这样做:
at_most=2
df.apply(lambda x: (x[np.isfinite(x)][:at_most]).sum(), axis=1)