我要合并(加入)4个不同的CSV文件。 主文件包含所有列,并包含其他文件之一的标识符(联接列)。
例如,主文件包含:
Name | Address | ID_1 | ID_2 | ID_3
Ruth D. Batie | 4962 Hill Street | 1_001 | NaN | 3_004
Kelley C. Rice | 1074 Tipple Road | NaN | 2_002 | NaN
Gary P. Kirby | 1520 Robinson Court | 1_004 | 2_002;2_004 | 3_004
文件查找1包含:
ID_1 | Monthly_MB
1_001 | 1557
1_002 | 1024
1_003 | 500
1_004 | 24
文件查找2包含:
ID_2 | platform
2_001 | ios
2_002 | android
2_003 | ios
2_004 | ios
文件查找3包含:
ID_3 | Device
3_001 | T31
3_002 | IN265
3_003 | AG_Flair
3_004 | BOOST2
我想结束这个:
Name | Address | ID_1 | ID_2 | ID_3
Ruth D. Batie | 4962 Hill Street | 1557 | NaN | BOOST2
Kelley C. Rice | 1074 Tipple Road | NaN | android | NaN
Gary P. Kirby | 1520 Robinson Court | 24 | android;ios | BOOST2
我的一些代码:
result = pd.merge(df_main,
df_1[['ID_1', 'Monthly_MB']],
df_2[['ID_2', 'platform']],
df_3[['ID_3', 'Device']],
on=' ??')
result.head()
然后我迷失了内部连接部分(on =''),因为要连接的列不同,并且一列包含两个值(甚至可以大于2),用分号分隔;
Gary P. Kirby | 1520 Robinson Court | 1_004 | 2_002;2_004 | 3_004
我对Pandas来说还很陌生,因此非常感谢您的帮助。
答案 0 :(得分:1)
我建议首先使用DataFrame.set_index
和Series.to_dict
创建包含所有查找文件的字典:
d = {'ID_1' : df2.set_index('ID_1')['Monthly_MB'].to_dict(),
'ID_2' : df3.set_index('ID_2')['platform'].to_dict(),
'ID_3' : df4.set_index('ID_3')['Device'].to_dict()}
然后按字典中的所有键循环并使用列表理解-如果是字符串,则首先按;
拆分值,按字符串首先映射值,再按join
依次返回;
:
for c in d.keys():
f = lambda x: ';'.join(str(d[c].get(y, '')) for y in x.split(';'))
if isinstance(x, str)
else x
df1[c] = df1[c].apply(f)
print (df1)
Name Address ID_1 ID_2 ID_3
0 Ruth D. Batie 4962 Hill Street 1557 NaN BOOST2
1 Kelley C. Rice 1074 Tipple Road NaN android NaN
2 Gary P. Kirby 1520 Robinson Court 24 android;ios BOOST2
答案 1 :(得分:1)
您可以使用类似下面的代码的方式来匹配/替换值。 添加if语句以检测具有多个值的单元格,并使用分号对值进行分割:
for i in df_main['ID_1']:
df_main.loc[df_main['ID_1']==i , 'ID_1'] = df_1.loc[df_1['ID_1']==i , 'Monthly_MB']