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

时间:2014-04-26 10:20:13

标签: python pandas

我有一个如下所示的DataFrame:

            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值。

Locate first and last non NaN values in a Pandas DataFrame所述,可以使用first_valid_index。不幸的是,它返回第一行,其中至少有一个元素不是NaN,并且每列不起作用。

3 个答案:

答案 0 :(得分:9)

您应该使用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将是一个包含每列的first_valid_index的系列。

您还可以将lambda函数定义为外部的正常函数:

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

然后像这样调用apply:

df.apply(first_valid_index)

答案 1 :(得分:1)

通过计算,我假设您的意思是访问?

最简单的方法是使用pd.Series.first_valid_index()方法,可能在dict理解中:

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

为了清楚起见,pandas DataFrame中的每一列都是一个系列。所以上面的内容与:

相同
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 :(得分:1)

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

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

如果您不希望获得每个组的第一个值,则可以添加1s的虚拟列。然后使用groupby&获取第一个非null值。第一个功能。

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()