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

yev*_*man 5 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
Run Code Online (Sandbox Code Playgroud)

我想计算每列中的第一个非NaN值.

作为定位在熊猫数据帧第一和最后一个非NaN值指出,first_valid_index可以使用.不幸的是,它返回第一行,其中至少有一个元素不是NaN,并且每列不起作用.

Fel*_*ein 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
Run Code Online (Sandbox Code Playgroud)

first_valid_indices然后将是一个包含每列的first_valid_index的系列.

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

def first_valid_index(series):
    return series.first_valid_index()
Run Code Online (Sandbox Code Playgroud)

然后调用这样的应用:

df.apply(first_valid_index)
Run Code Online (Sandbox Code Playgroud)

  • 而不是建立一个lambda函数,或一个真正的函数.您可以在Series类上使用未绑定的函数.`df.apply(pd.Series.first_valid_index)` (3认同)

Woo*_*ide 1

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

最简单的方法是使用pd.Series.first_valid_index()字典理解中的方法:

values = {col : DF.loc[DF[col].first_valid_index(), col] for col in DF.columns}
values
Run Code Online (Sandbox Code Playgroud)

需要明确的是,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]
Run Code Online (Sandbox Code Playgroud)

因此,我的单行解决方案中的操作是基于每列的。即,它不会产生您在对问题进行的编辑中似乎建议的错误类型。如果它没有按预期工作,请告诉我。