Pandas条件创建分组列:提取分组内指定时间对应的value值及时间格式适配方案
解决方案:按ID分组提取指定时间的Value并广播到全组
没问题,我来帮你搞定这个需求!下面分两种场景给你提供可行的代码方案:
一、原场景:time值为'11am'的情况
你需要每个ID分组内的所有行都对应该组time='11am'时的value值,这里有两种简洁的实现方式:
方法1:使用groupby + transform(推荐)
这种方法最直接,利用groupby按ID分组后,用transform把指定条件的value值广播到整个分组的每一行:
import pandas as pd data = {'id':['1', '1', '1','1', '2', '2', '2', '2'],'time':['10am', '11am', '12pm', '13pm','10am', '11am', '12pm', '13pm'], 'value':[20,21,19,18,56,47,78,96]} df = pd.DataFrame(data) # 按id分组,提取每组time='11am'的value,广播到全组,最后转成字符串(和你的示例格式一致) df['newcolum'] = df.groupby('id')['value'].transform(lambda x: x[df.loc[x.index, 'time'] == '11am'].iloc[0]).astype(str) print(df)
运行后就能得到你期望的结果,transform会自动把每个分组的目标值填充到该组的所有行中。
方法2:先构建映射表再合并
如果你觉得lambda不够直观,可以先筛选出time='11am'的行作为映射表,再通过merge合并到原DataFrame:
# 构建id到11am对应value的映射表 id_11am_map = df[df['time'] == '11am'][['id', 'value']].rename(columns={'value': 'newcolum'}) # 合并到原df,保留所有行 df = df.merge(id_11am_map, on='id', how='left') # 转成字符串(和示例格式一致) df['newcolum'] = df['newcolum'].astype(str)
这种方法逻辑更清晰,适合对分组操作不太熟悉的场景。
二、补充场景:time值为'11:00:00'的情况
其实这个场景的逻辑和上面完全一致,只需要把条件中的字符串从'11am'改成'11:00:00'就可以了,比如用方法1的话:
# 假设你的time列值是'11:00:00' df['newcolum'] = df.groupby('id')['value'].transform(lambda x: x[df.loc[x.index, 'time'] == '11:00:00'].iloc[0]).astype(str)
如果是用方法2,同样只需要修改筛选条件:
id_11am_map = df[df['time'] == '11:00:00'][['id', 'value']].rename(columns={'value': 'newcolum'}) df = df.merge(id_11am_map, on='id', how='left') df['newcolum'] = df['newcolum'].astype(str)
本质上就是匹配特定的时间字符串,不管格式是am/pm还是HH:MM:SS,只要字符串完全匹配就能正确提取。
内容的提问来源于stack exchange,提问作者Bogdan Titomir
相关产品推荐
相关产品推荐

