我有一个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值。
正如定位Pandas DataFrame中的第一个和最后一个非NaN值所指出的,可以使用first_valid_index。不幸的是,它返回第一行,其中至少有一个元素不是NaN,并且不适用于每列。
您应该使用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
CCD_ 1将是包含每个列的first_valid_index的序列。
您也可以将lambda
函数定义为之外的正常函数
def first_valid_index(series):
return series.first_valid_index()
然后像这样调用apply:
df.apply(first_valid_index)
内置函数DataFrame.groupby().column.first()返回列中的第一个非null值,而last()则返回最后一个。
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.first.html
如果您不希望获得每组的第一个值,可以添加一个1的伪列。然后使用groupby&第一个功能。
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()
我认为你所说的计算是指访问?
最简单的方法是在dict理解中使用pd.Series.first_valid_index()
方法:
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]
因此,我的单行解决方案中的操作是基于每列的。也就是说,它不会造成你在编辑问题时所暗示的那种错误。如果它没有按预期工作,请告诉我。