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

1 投票
2 回答
2808 浏览
提问于 2025-04-18 05:15

我想高效地计算一个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)

撰写回答