Pandas中groupby分组首元素赋值至DataFrame列出现NaN值的问题排查
问题原因与解决方案
这是个Pandas里很常见的索引对齐问题,我来帮你理清楚为什么会出现全NaT的情况,以及怎么解决:
为什么会出现全NaT?
你执行df.groupby('cumsum').first()['Date']后得到的Series,它的索引是cumsum列的唯一值(比如1、2、3...561),而你的原始DataFramedf的索引是时间戳(比如2021-01-01 00:00:00这类)。
当你直接用df["Date_First"] = 分组结果赋值时,Pandas会严格按照索引匹配来填充数据:它会拿原df的每一行索引,去分组结果的索引里找对应的值,但两者的索引完全不重合,所以所有位置都只能填充NaT(时间类型的缺失值)。
解决办法
有几种简单的方式可以实现你的需求,推荐用第一种最直接的:
方法1:用groupby.transform()
transform方法会自动把分组后的结果广播到该组的每一行,返回和原df长度一致、索引匹配的Series,直接赋值就没问题:
df["Date_First"] = df.groupby('cumsum')['Date'].transform('first')
方法2:用字典映射
先把分组后的首日期转成字典(键是cumsum的值,值是对应首日期),再通过map方法匹配到原df的每一行:
# 先构建cumsum到首日期的映射字典 first_date_map = df.groupby('cumsum')['Date'].first().to_dict() # 用map把每个cumsum值对应的首日期填充到新列 df["Date_First"] = df['cumsum'].map(first_date_map)
方法3:合并DataFrame
如果你需要保留更多分组相关的信息,可以先把分组结果转成带cumsum列的DataFrame,再和原df合并:
# 生成包含cumsum和对应首日期的DataFrame first_date_df = df.groupby('cumsum')['Date'].first().reset_index(name='Date_First') # 左连接合并,保证原df的所有行都保留 df = df.merge(first_date_df, on='cumsum', how='left')
这三种方法都能帮你正确把分组首日期填充到新列里,不会再出现全NaT的情况啦~
内容的提问来源于stack exchange,提问作者c_data
相关产品推荐
相关产品推荐

