如何基于其他列值生成multi_index列?按ID组判断date_int首尾值
实现方法
可以用Pandas的分组(groupby)功能快速实现需求,核心思路是按ID分组后,判断每组date_int列的首尾值是否均为yes,再将结果映射到组内所有行。
方案一:使用transform直接生成列(推荐)
这种方式无需额外合并操作,直接通过transform将分组判断结果广播到每一行:
import pandas as pd # 构造示例数据(实际使用时替换为你的数据源) data = { 'ID': [1,1,1,1,1,1,2,2,2,2,2,2], 'A': ['activity1','activity2','activity3','activity4','activity5','activity6','activity7','activity8','activity9','activity10','activity11','activity12'], 'index': [1,2,3,4,5,6,1,2,3,4,5,6], 'timestamp': ['2021-02-01 12:03:20','2021-02-11 12:03:20','2021-11-23 11:46:40','2021-11-24 11:46:40','2021-11-25 11:46:40','2021-11-26 11:46:40','2021-03-01 12:03:20','2021-03-11 12:03:20','2021-12-23 11:46:40','2021-12-27 11:46:40','2021-12-28 11:46:40','2021-12-29 11:46:40'], 'date_int': ['yes','no','no','no','no','no','yes','no','no','no','no','yes'] } df = pd.DataFrame(data) # 生成multi_index列 df['multi_index'] = df.groupby('ID')['date_int'].transform( lambda x: 'yes' if x.iloc[0] == 'yes' and x.iloc[-1] == 'yes' else 'no' ) print(df)
方案二:先分组计算结果再合并
如果需要单独查看每组的判断逻辑,可先计算分组结果,再合并回原数据:
import pandas as pd # 构造示例数据 data = { 'ID': [1,1,1,1,1,1,2,2,2,2,2,2], 'A': ['activity1','activity2','activity3','activity4','activity5','activity6','activity7','activity8','activity9','activity10','activity11','activity12'], 'index': [1,2,3,4,5,6,1,2,3,4,5,6], 'timestamp': ['2021-02-01 12:03:20','2021-02-11 12:03:20','2021-11-23 11:46:40','2021-11-24 11:46:40','2021-11-25 11:46:40','2021-11-26 11:46:40','2021-03-01 12:03:20','2021-03-11 12:03:20','2021-12-23 11:46:40','2021-12-27 11:46:40','2021-12-28 11:46:40','2021-12-29 11:46:40'], 'date_int': ['yes','no','no','no','no','no','yes','no','no','no','no','yes'] } df = pd.DataFrame(data) # 按ID分组,提取首尾date_int并判断 group_result = df.groupby('ID')['date_int'].agg( first_val='first', last_val='last' ).assign( multi_index=lambda x: x.apply(lambda row: 'yes' if row['first_val'] == 'yes' and row['last_val'] == 'yes' else 'no', axis=1) ) # 合并结果到原数据 df = df.merge(group_result['multi_index'], on='ID', how='left') print(df)
两种方案最终都会生成符合要求的multi_index列,运行后输出的结果与你提供的示例一致。
内容的提问来源于stack exchange,提问作者mattiadt
相关产品推荐
相关产品推荐

