基于两数据集条件列值的动态时间戳追加问题
问题解决:按ID匹配拼接多时间戳到DataFrame
需求说明
有两个DataFrame:df1和df2,共享id列。需要将df2中每个id对应的唯一DateTime值用分号;拼接后,添加到df1的新列fix_timestamps中,且保证与对应id匹配。
示例数据:
- df1:
| id | Date | another_col |
|---|---|---|
| WPA54 | 2023-08-01 | A |
| WPA54 | 2023-08-01 | B |
| WPA54 | 2023-08-01 | C |
| WPA54 | 2023-08-01 | D |
| IBT675 | 2023-08-01 | E |
| IBT675 | 2023-08-01 | F |
- df2:
| id | DateTime |
|---|---|
| WPA54 | 2023-08-01 00:02:52.527 |
| WPA54 | 2023-08-01 00:10:10.640 |
| WPA54 | 2023-08-01 00:10:12:740 |
| WPA54 | 2023-08-01 00:10:26.937 |
| IBT675 | 2023-08-01 00:10:10.640 |
| IBT675 | 2023-08-01 00:10:11.540 |
| IBT675 | 2023-08-01 00:10:12:740 |
原代码问题分析
原代码使用groupby(df2['id']).transform(...),返回的是与df2行数一致的序列,直接赋值给df1新列时,因两个DataFrame行数不匹配,pandas会广播填充,导致所有行的fix_timestamps值重复;同时该方式未建立df1与df2的id对应关系,最终出现错误结果。
正确解决方案
核心思路
- 先对
df2按id分组,聚合生成每个id对应的唯一时间戳拼接串,得到id到拼接结果的映射关系 - 将该映射关系匹配到
df1中,生成目标列
完整代码
import pandas as pd # 读取文件 file1_path = 'input1.csv' file2_path = 'input2.csv' df1 = pd.read_csv(file1_path) df2 = pd.read_csv(file2_path) # 处理df2:按id分组,聚合唯一DateTime为分号分隔的字符串 id_timestamp_map = df2.groupby('id')['DateTime'].apply( lambda x: ';'.join(x.astype(str).unique()) ) # 将映射匹配到df1,生成新列 df1['fix_timestamps'] = df1['id'].map(id_timestamp_map) # 保存结果 output_file_path = 'output.csv' df1.to_csv(output_file_path, index=False)
结果验证
运行后df1的fix_timestamps列会正确匹配:
- 所有
WPA54的行显示:2023-08-01 00:02:52.527;2023-08-01 00:10:10.640;2023-08-01 00:10:12:740;2023-08-01 00:10:26.937 - 所有
IBT675的行显示:2023-08-01 00:10:10.640;2023-08-01 00:10:11.540;2023-08-01 00:10:12:740
内容的提问来源于stack exchange,提问作者user3103082
相关产品推荐
相关产品推荐

