我想有效地总结一个pandas DataFrame的前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()
然而,这不是特别有效。我喜欢一种矢量化的方法。我已经尝试了很多不同的方法来屏蔽DataFrame或底层数组(df.values),但是没有找到任何可行的方法。
我担心我在这里遗失了一些明显的东西。
注意:如果行只有少于N个项目,那就没关系。我只想要每排N个。
答案 0 :(得分:3)
我认为你可以做到:
at_most=2
df.apply(lambda x: (x[np.isfinite(x)][:at_most]).sum(), axis=1)
答案 1 :(得分:1)
不确定它是否更快,但更多" pandonic"方式可能看起来像:
def sum_first_n(row,n):
return row.dropna()[:n].sum()
df.apply(sum_first_n, n=3, axis = 1)
这将返回一个与原始数据帧具有相同索引的系列。