一起使用groupby(" 1d")和first_valid_index

时间:2016-07-04 14:44:48

标签: python pandas

This帖子显示了如何使用first_valid_index查找数据框列中第一次出现的值。如何使用first_valid_index和每日groupby来查找链接帖子中显示的相同示例数据帧的每天第一次出现?

这是我需要使用的groupby代码:

grouper = pd.TimeGrouper("1d")

编辑:

当我使用lambdaapply方法时,它会提供正确的输出。我无法将此输出发送到新列['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

1 个答案:

答案 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