合并大熊猫时如何更改列名

时间:2019-12-13 03:00:42

标签: pandas

我有以下三个列表。

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。而且,我还没有找到剩下的方法。在大熊猫中有一种简单的方法吗?

很高兴在需要时提供更多详细信息。

2 个答案:

答案 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