计算DataFrame中每列的第一个非缺失值

10 投票
3 回答
8737 浏览
提问于 2025-04-18 04:20

我有一个数据表,看起来是这样的:

            1125400  5430095  1095751
2013-05-22   105.24      NaN  6507.58
2013-05-23   104.63      NaN  6393.86
2013-05-26   104.62      NaN  6521.54
2013-05-27   104.62      NaN  6609.31
2013-05-28   104.54    87.79  6640.24
2013-05-29   103.91    86.88  6577.39
2013-05-30   103.43    87.66  6516.55
2013-06-02   103.56    87.55  6559.43

我想要计算每一列中第一个不是NaN的值。

正如这个链接所提到的,可以使用first_valid_index这个方法。不过,它返回的是至少有一个元素不是NaN的第一行,而不是按列来处理。

3 个回答

1

我猜你说的计算是指访问数据吧?

最简单的方法是使用 pd.Series.first_valid_index() 这个方法,可能是在一个字典推导式里面:

values = {col : DF.loc[DF[col].first_valid_index(), col] for col in DF.columns}
values

为了更清楚,每一列在 pandas 的 DataFrame 中都是一个 Series。所以上面的操作和这样做是一样的:

values = {}
for column in DF.columns:
    First_Non_Null_Index = DF[column].first_valid_index()
    values[column] = DF.loc[First_Non_Null_Index, column]

所以我这个一行的解决方案是针对每一列进行操作的。也就是说,它不会产生你在问题编辑中提到的那种错误。如果有问题,请告诉我。

2

内置的函数 DataFrame.groupby().column.first() 会返回某一列中的第一个非空值,而 last() 则返回最后一个非空值。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.first.html

如果你不想获取每个组的第一个值,可以添加一个全是1的虚拟列。然后通过 groupby 和 first 函数来获取第一个非空值。

from Pandas import DataFrame

df = DataFrame({'a':[None,1,None],'b':[None,2,None]})
df['dummy'] = 1
df.groupby('dummy').first()
df.groupby('dummy').last()
14

你应该使用apply这个函数,它可以高效地对每一列(默认情况下)或每一行应用一个函数:

>>> first_valid_indices = df.apply(lambda series: series.first_valid_index())
>>> first_valid_indices
1125400   2013-05-22 00:00:00
5430095   2013-05-28 00:00:00
1095751   2013-05-22 00:00:00

first_valid_indices将会是一个系列,里面包含每一列的第一个有效索引。

你也可以把lambda函数定义成一个普通的函数,放在外面:

def first_valid_index(series):
    return series.first_valid_index()

然后像这样调用apply:

df.apply(first_valid_index)

撰写回答