1

为什么这行不通?

如果我只是打印出来,我会得到正确的结果,但如果我使用相同的方法将它分配给 df 列,我会得到 Nan 值......

print(df.groupby('cumsum').first()['Date'])

cumsum
1     2021-01-05 11:00:00
2     2021-01-06 08:00:00
3     2021-01-06 10:00:00
4     2021-01-06 13:00:00
5     2021-01-06 14:00:00
              ...        
557   2021-08-08 08:00:00
558   2021-08-08 09:00:00
559   2021-08-08 11:00:00
560   2021-08-08 13:00:00
561   2021-08-08 18:00:00
Name: Date, Length: 561, dtype: datetime64[ns]

对比

df["Date_First"] = df.groupby('cumsum').first()['Date']

Date
2021-01-01 00:00:00   NaT
2021-01-01 01:00:00   NaT
2021-01-01 02:00:00   NaT
2021-01-01 03:00:00   NaT
2021-01-01 04:00:00   NaT
                       ..
2021-08-08 14:00:00   NaT
2021-08-08 15:00:00   NaT
2021-08-08 16:00:00   NaT
2021-08-08 17:00:00   NaT
2021-08-08 18:00:00   NaT
Name: Date_Last, Length: 5268, dtype: datetime64[ns]

这里会发生什么?

我在这里使用了一个示例表单,但想要获取第一个元素。 https://www.codeforests.com/2021/03/30/group-consecutive-rows-in-pandas/

4

1 回答 1

3

这里会发生什么?

如果使用:

print(df.groupby('cumsum')['Date'].first())
#print(df.groupby('cumsum').first()['Date'])

输出是cumsum使用聚合函数按列聚合的值first

所以在索引中是唯一值cumsum,所以如果分配给新列,则与原始索引不匹配,输出为NaNs。


解决方案是 use GroupBy.transform,它将聚合值重复到具有与原始 DataFrame 相同大小的系列(列),因此索引与原始索引相同并且分配完美:

df["Date_First"] = df.groupby('cumsum')['Date'].transform("first")
于 2021-08-19T06:41:31.193 回答