Pandas:每行前N个非缺失值的总和

时间:2014-05-03 17:05:28

标签: python numpy pandas

我想有效地总结一个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个。

2 个答案:

答案 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)

这将返回一个与原始数据帧具有相同索引的系列。