Python 在数据帧中查找第一个和最后一个非NaN值

Python 在数据帧中查找第一个和最后一个非NaN值,python,datetime,pandas,Python,Datetime,Pandas,我有一个熊猫数据框按日期索引。有许多列,但许多列仅为时间序列的一部分填充。我想找到非NaN值的第一个和最后一个值的位置,以便提取日期并查看特定列的时间序列的长度 有没有人能给我指出正确的方向,告诉我怎么做这样的事情?提前感谢。@behzad.nouri的解决方案非常有效,分别使用and返回第一个和最后一个非NaN值。以下是一些有用的示例 系列 使用notna和idxmax的替代解决方案: # first valid index s.notna().idxmax() # 'b' # last v

我有一个熊猫
数据框
按日期索引。有许多列,但许多列仅为时间序列的一部分填充。我想找到非NaN值的第一个和最后一个值的位置,以便提取日期并查看特定列的时间序列的长度


有没有人能给我指出正确的方向,告诉我怎么做这样的事情?提前感谢。

@behzad.nouri的解决方案非常有效,分别使用and返回第一个和最后一个非
NaN值。

以下是一些有用的示例

系列 使用
notna
idxmax
的替代解决方案:

# first valid index
s.notna().idxmax()
# 'b'

# last valid index
s.notna()[::-1].idxmax()
# 'd'

数据帧
(first | last)\u有效索引
未在数据帧上定义,但您可以使用
apply
将其应用于每列

# first valid index for each column
df.apply(pd.Series.first_valid_index)

A    1
B    0
dtype: int64

# last valid index for each column
df.apply(pd.Series.last_valid_index)

A    3
B    0
dtype: int64
与前面一样,您还可以使用
notna
idxmax
。这是更自然的语法

# first valid index
df.notna().idxmax()

A    1
B    0
dtype: int64

# last valid index
df.notna()[::-1].idxmax()

A    3
B    0
dtype: int64

谢谢@behzad.nouri这正是我想要的!当缺少的值可能为“0”时,是否有解决方案?(即每个组/时间序列查找第一个非零值)?@KorayTugay A系列为1D(即单列)。如果要检查
df
中的更多列,可以迭代df。例如,
对于col\u name,df.items()中的数据:print(“列{}的第一个有效索引位于{}”).format(col\u name,data.First\u valid\u index())
可以使用
df.apply(Series.First\u valid\u index)
而不是迭代数据帧的列
是指对于完整的
NaN
列,它将返回
0
。在这种情况下,我希望使用
NaN
,因此我宁愿始终使用
.apply(Series.first\u valid\u index)
# first valid index for each column
df.apply(pd.Series.first_valid_index)

A    1
B    0
dtype: int64

# last valid index for each column
df.apply(pd.Series.last_valid_index)

A    3
B    0
dtype: int64
# first valid index
df.notna().idxmax()

A    1
B    0
dtype: int64

# last valid index
df.notna()[::-1].idxmax()

A    3
B    0
dtype: int64