计算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的值。
正如这个链接所提到的,可以使用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)