我有以下三个列表。
dummy_data1 = {
'id': ['no1', 'no2', 'no3', 'no4', 'no5'],
'Feature1': ['A', 'C', 'E', 'G', 'I'],
'Feature2': ['B', 'D', 'F', 'H', 'J']}
dummy_data2 = {
'id': ['no5', 'no3', 'no1', 'no8', 'no12'],
'Feature1': ['K', 'M', 'O', 'Q', 'S'],
'Feature2': ['L', 'N', 'P', 'R', 'T']}
dummy_data3 = {
'id': ['no1', 'no2', 'no3', 'no4', 'no5', 'no7', 'no8', 'no9', 'no10', 'no11'],
'Feature1': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23],
'Feature2': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23]}
我想在重命名列时将这三个列表合并到一个pandas数据框中。因此,我的输出应如下所示(注意:将具有所有行的值的列合并时,只会合并)。
id, df1_Feature1, df1_Feature2, df2_Feature1, df2_Feature2, df3_Feature1, df3_Feature2
no1, A, B, O, P, 12, 12
no3, E, F, M, N, 14, 14
no5, I, J, K, L, 16, 16
我尝试如下进行操作。
df1 = pd.DataFrame(dummy_data1, columns = ['id', 'Feature1', 'Feature2'])
df2 = pd.DataFrame(dummy_data2, columns = ['id', 'Feature1', 'Feature2'])
df3 = pd.DataFrame(dummy_data3, columns = ['id', 'Feature1', 'Feature2'])
merged = pd.merge(df1, df2)
merged = pd.merge(df3, merged)
但是,我更喜欢一行merge
。而且,我还没有找到剩下的方法。在大熊猫中有一种简单的方法吗?
很高兴在需要时提供更多详细信息。
答案 0 :(得分:1)
您可以在第一步中直接命名列
dummy_data1 = {
'id': ['no1', 'no2', 'no3', 'no4', 'no5'],
'df1_Feature1': ['A', 'C', 'E', 'G', 'I'],
'df1_Feature2': ['B', 'D', 'F', 'H', 'J']}
dummy_data2 = {
'id': ['no5', 'no3', 'no1', 'no8', 'no12'],
'df2_Feature1': ['K', 'M', 'O', 'Q', 'S'],
'df2_Feature2': ['L', 'N', 'P', 'R', 'T']}
dummy_data3 = {
'id': ['no1', 'no2', 'no3', 'no4', 'no5', 'no7', 'no8', 'no9', 'no10', 'no11'],
'df3_Feature1': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23],
'df3_Feature2': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23]}
df1 = pd.DataFrame(dummy_data1)
df2 = pd.DataFrame(dummy_data2)
df3 = pd.DataFrame(dummy_data3)
第二,合并功能需要知道数据框要连接到哪一列。
merged = pd.merge(df1, df2, on='id', how='inner')
merged = pd.merge(df3, merged, on='id', how='inner')
结果:
id df3_Feature1 df3_Feature2 df1_Feature1 df1_Feature2 df2_Feature1 \
0 no1 12 12 A B O
1 no3 14 14 E F M
2 no5 16 16 I J K
df2_Feature2
0 P
1 N
2 L
答案 1 :(得分:1)
假设id
在每个数据帧中都是唯一的,则可以对每个数据帧使用pd.concat
和listcomp和set_index id
names = ['df1_', 'df2_', 'df3_']
dfs = [df1, df2, df3]
df_final = pd.concat([df.set_index('id').add_prefix(name) for name, df in zip(names, dfs)], axis=1).dropna()
Out[558]:
df1_Feature1 df1_Feature2 df2_Feature1 df2_Feature2 df3_Feature1 \
no1 A B O P 12.0
no3 E F M N 14.0
no5 I J K L 16.0
df3_Feature2
no1 12.0
no3 14.0
no5 16.0
另一种方法是使用join
:
Join
只是一个特殊的版本合并,它支持本地合并多个数据帧
names = ['df2_', 'df3_']
dfs = [df2, df3]
df_final = (df1.set_index('id').join([df.set_index('id').add_prefix(name) for name, df in zip(names, dfs)], how='inner')
.rename({'Feature1': 'df1_Feature1', 'Feature2': 'df1_Feature2'}, axis=1).reset_index())
Out[595]:
id df1_Feature1 df1_Feature2 df2_Feature1 df2_Feature2 df3_Feature1 \
0 no1 A B O P 12
1 no3 E F M N 14
2 no5 I J K L 16
df3_Feature2
0 12
1 14
2 16