识别相同的列并将它们融合为一个

Recognise identical columns and melt them into one

我有问题。我正在将两个数据帧 df1df2 合并在一起。我在两者中都有一个名为 name 的列。合并正确地执行所有操作,并向每个 name 添加一个 _ 和一个 xy。不幸的是,这些专栏说的是同样的事情。 是否有比较 name_xname_y 列的选项,如果每行中的值相同,则将该列合并到 name?

需要注意的是,我不仅有name这一列,还有几个不同的和相同的,所以它应该像一个循环。例如,我的数据集有100多列,因此很难手动确定哪些列具有相同的名称,哪些列没有。

# df1
   customerId   name
0           1  Anton
1           2  Marie
2           3    Max
3           4   Fran
4           5  Josie

#df2
   customerIddd   name     name2
0             1  Anton    Antond
1             2  Marie    Maride
2             3    Max      Ma2x
3             4   Fran    Frdsan
4             5  Josie  Joasdsie

代码

import pandas as pd

d = {'customerId': [1, 2, 3, 4, 5],
     'name': ['Anton', 'Marie', 'Max', 'Fran', 'Josie']
    }
df = pd.DataFrame(data=d)

d2 = {'customerIddd': [1, 2, 3, 4, 5],
      'name': ['Anton', 'Marie', 'Max', 'Fran', 'Josie'],
     'name2': ['Antond', 'Maride', 'Ma2x', 'Frdsan', 'Joasdsie']
    }
df2 = pd.DataFrame(data=d2)
print(df2)

df_merged = pd.merge(df,
            df2, how='inner',
            left_on=['customerId'], right_on=['customerIddd'])
print(df_merged)

输出

   customerId name_x  customerIddd name_y     name2
0           1  Anton             1  Anton    Antond
1           2  Marie             2  Marie    Maride
2           3    Max             3    Max      Ma2x
3           4   Fran             4   Fran    Frdsan
4           5  Josie             5  Josie  Joasdsie

我想要的

   customerId name    customerIddd    name2
0           1  Anton             1   Antond
1           2  Marie             2   Maride
2           3    Max             3     Ma2x
3           4   Fran             4   Frdsan
4           5  Josie             5  Joasdsie

您可以与 suffixes=['', '_right'] 合并,然后删除名称以 _right:

结尾的所有列
df_merged = pd.merge(df,
            df2, how='inner',
            left_on=['customerId'], right_on=['customerIddd'],
            suffixes=['', '_right'])
df_merged.drop([col for col in df_merged.columns if col.endswith('_right')], axis=1)

输出(用于您的示例数据)

   customerId   name  customerIddd     name2
0           1  Anton             1    Antond
1           2  Marie             2    Maride
2           3    Max             3      Ma2x
3           4   Fran             4    Frdsan
4           5  Josie             5  Joasdsie

如果您在 table 上的名字完全相同,您可以使用它加入

df_merged = pd.merge(df,
        df2, how='inner',
        left_on=['customerId','name'], right_on=['customerIddd','name'])
print(df_merged)

输出将如您所愿

   customerId   name  customerIddd     name2
0           1  Anton             1    Antond
1           2  Marie             2    Maride
2           3    Max             3      Ma2x
3           4   Fran             4    Frdsan
4           5  Josie             5  Joasdsie