This帖子显示了如何使用first_valid_index
查找数据框列中第一次出现的值。如何使用first_valid_index和每日groupby来查找链接帖子中显示的相同示例数据帧的每天第一次出现?
这是我需要使用的groupby代码:
grouper = pd.TimeGrouper("1d")
编辑:
当我使用lambda
和apply
方法时,它会提供正确的输出。我无法将此输出发送到新列['test_output']
,因为它只显示NaT:
df['test_output'] = df.groupby(grouper)['test_1'].apply(lambda x: x.first_valid_index())
df
Out[9]:
test_1 test_output
2014-03-04 09:00:00 NaN NaT
2014-03-04 10:00:00 NaN NaT
2014-03-04 11:00:00 NaN NaT
2014-03-04 12:00:00 NaN NaT
2014-03-04 13:00:00 NaN NaT
2014-03-04 14:00:00 1.0 NaT
2014-03-04 15:00:00 1.0 NaT
2014-03-04 16:00:00 1.0 NaT
2014-03-05 09:00:00 1.0 NaT
答案 0 :(得分:3)
IIUC您可以在groupby
对象上使用first
:
In [95]:
df.groupby(grouper).first()
Out[95]:
test_1
2014-03-04 1.0
2014-03-05 1.0
应该有用,上面是使用与链接问题相同的数据生成的
修改强>
我认为上述内容实际上是正确的,因为它与调用head(1)
不同:
In [3]:
df.groupby(grouper).head(1)
Out[3]:
test_1 test_output
2014-03-04 09:00:00 NaN NaN
2014-03-05 09:00:00 1 1
但您也可以使用first_valid_index
lambda
来呼叫apply
:
In [6]:
df.groupby(grouper)['test_1'].apply(lambda x: x.first_valid_index())
Out[6]:
2014-03-04 2014-03-04 14:00:00
2014-03-05 2014-03-05 09:00:00
Name: test_1, dtype: datetime64[ns]
修改强>
要将此列添加为列有点棘手,这是因为您尝试将orig索引与新的每日分组groupby
对象进行匹配,因此它不会对齐哪个是为什么你NaT
。您可以做的是在索引上调用to_series
,我们希望这样做是因为我们可以调用map
,并只访问date
属性。 map
将执行查找,以便在groupby
结果的日期匹配,并根据需要返回第一个有效日期:
In [136]:
df['first'] = df.index.to_series().dt.date.map(df.groupby(grouper)['test_1'].apply(lambda x: x.first_valid_index()))
df
Out[136]:
test_1 test_output first
2014-03-04 09:00:00 NaN NaN 2014-03-04 14:00:00
2014-03-04 10:00:00 NaN NaN 2014-03-04 14:00:00
2014-03-04 11:00:00 NaN NaN 2014-03-04 14:00:00
2014-03-04 12:00:00 NaN NaN 2014-03-04 14:00:00
2014-03-04 13:00:00 NaN NaN 2014-03-04 14:00:00
2014-03-04 14:00:00 1.0 1.0 2014-03-04 14:00:00
2014-03-04 15:00:00 1.0 1.0 2014-03-04 14:00:00
2014-03-04 16:00:00 1.0 1.0 2014-03-04 14:00:00
2014-03-05 09:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 10:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 11:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 12:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 13:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 14:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 15:00:00 1.0 1.0 2014-03-05 09:00:00
2014-03-05 16:00:00 1.0 1.0 2014-03-05 09:00:00