在R语言数据框中匹配相同ID和LOC的记录并合并行数据
合并DataFrame中同ID同LOC的行数据
原始数据
mydata ID LOC LOC_a LOC_b 1 LAX 1 2 1 LAX 3 4 1 NJ 1 2 2 LAX 1 2 3 NJ 1 2 4 DM 5 6 4 DM 7 8
期望输出
Desired output ID LOC LOC_a LOC_b LOC_2a LOC_2b 1 LAX 1 2 3 4 1 NJ 1 2 2 LAX 1 2 3 NJ 1 2 4 DM 5 6 7 8
解决方案
用Pandas可以通过分组聚合的方式实现需求,代码如下:
import pandas as pd # 构造原始DataFrame data = { 'ID': [1, 1, 1, 2, 3, 4, 4], 'LOC': ['LAX', 'LAX', 'NJ', 'LAX', 'NJ', 'DM', 'DM'], 'LOC_a': [1, 3, 1, 1, 1, 5, 7], 'LOC_b': [2, 4, 2, 2, 2, 6, 8] } mydata = pd.DataFrame(data) # 按ID和LOC分组,收集每组的LOC_a、LOC_b值为列表 grouped = mydata.groupby(['ID', 'LOC'])[['LOC_a', 'LOC_b']].agg(list) # 将每组的LOC_a和LOC_b列表合并,扩展为多列并命名 expanded = grouped.apply(lambda x: pd.Series(x['LOC_a'] + x['LOC_b']), axis=1) expanded.columns = ['LOC_a', 'LOC_b', 'LOC_2a', 'LOC_2b'] # 重置索引,将ID和LOC转为普通列,空值填充为空字符串 result = expanded.reset_index().fillna('') print(result)
代码说明
- 分组聚合:通过
groupby(['ID', 'LOC'])将同一ID且同一LOC的行归为一组,用agg(list)把每组的LOC_a、LOC_b值收集成列表; - 扩展列:把每组的LOC_a列表和LOC_b列表合并后转为Series,自动生成对应列,2行的组会生成4个值,1行的组仅生成2个值,剩余位置为NaN;
- 整理结果:重置索引恢复ID和LOC列,用
fillna('')把空值替换为空白字符串,匹配期望输出格式。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

