【问题标题】:Python Merge columns from multiple data frames into a single dataframePython将来自多个数据帧的列合并到一个数据帧中
【发布时间】:2020-07-26 12:14:00
【问题描述】:

我正在合并 5 个文件。每个文件都有某些列名,这些列名在其他文件中是相同的。我使用this answer 来执行concat 操作。在所有文件中有一列是唯一的,即 ID。当我合并列时,我注意到后缀(_x,_y)被应用于列名的末尾(由于合并功能),这些列名重复。如何将这些列合并为一列(不考虑空值)。

例如:

Dataframe 1
ID    Name    Age    LAN_NBR
1     ABC     24     G284992

Dataframe 2
ID    Name    Street     City     State    TYPE
2     John    Wacker     Chicago  IL       HUB

Dataframe 3
ID    CLOSE_DATE    TYPE
3     1/1/2021      HUB

Dataframe 4
ID    TYPE    LAN_NBR
1     HUB     G284992

预期输出

ID    Name    Age    LAN_NBR    Street     City     State    TYPE    CLOSE_DATE
1     ABC     24     G284992                                 HUB
2     John                      Wacker     Chicago  IL       HUB
3                                                            HUB     1/1/2021

代码

obj1=pd.read_excel("file1.xlsx")
obj2=pd.read_excel("file2.xlsx")
obj3=pd.read_excel("file3.xlsx")
obj4=pd.read_excel("file4.xlsx")
obj5=pd.read_excel("file5.xlsx")

obj1_ID=pd.DataFrame(obj1["ID"])
obj2_ID=pd.DataFrame(obj2["ID"])
obj3_ID=pd.DataFrame(obj3["ID"])
obj4_ID=pd.DataFrame(obj4["ID"])
obj5_ID=pd.DataFrame(obj5["ID"])

concat_pd=[obj1_ID,obj2_ID,obj3_ID,obj4_ID,obj5_ID]
obj_final=pd.concat(concat_pd).fillna('')

obj_final.obj_final.drop_duplicates(subset='ID',keep='first')

merge1=pd.merge(left=obj_final, right=obj1, on="ID", how="left")
merge1=pd.merge(left=obj_final, right=obj2, on="ID", how="left")
merge1=pd.merge(left=obj_final, right=obj3, on="ID", how="left")
merge1=pd.merge(left=obj_final, right=obj4, on="ID", how="left")
merge1=pd.merge(left=obj_final, right=obj5, on="ID", how="left")

【问题讨论】:

  • 您可以设置suffix = (None, "_drop"),然后将最终数据框重新索引到其他数据框列名的并集。

标签: python pandas numpy dataframe merge


【解决方案1】:

选项 1: concatdrop_duplicates

(pd.concat( (df1, df2, df3, df4), sort=False)
   .groupby('ID')
   .bfill()
   .drop_duplicates('ID')
   .reset_index(drop=True)
)

输出:

   ID  Name   Age  LAN_NBR  Street     City State TYPE CLOSE_DATE
0   1   ABC  24.0  G284992     NaN      NaN   NaN  HUB        NaN
1   2  John   NaN      NaN  Wacker  Chicago    IL  HUB        NaN
2   3   NaN   NaN      NaN     NaN      NaN   NaN  HUB   1/1/2021

选项 2:按照@ansev 的建议使用 combine_first

ret_df = pd.DataFrame()

for d in (df1, df2, df3, df4):
    ret_df = ret_df.combine_first(d.set_index('ID') )

ret_df = ret_df.reset_index() 

输出

   ID   Age CLOSE_DATE     City  LAN_NBR  Name State  Street TYPE
0   1  24.0        NaN      NaN  G284992   ABC   NaN     NaN  HUB
1   2   NaN        NaN  Chicago      NaN  John    IL  Wacker  HUB
2   3   NaN   1/1/2021      NaN      NaN   NaN   NaN     NaN  HUB

【讨论】:

    【解决方案2】:

    您可以使用concatgroupbyfirst 来保持第一个非空值可用(如果每个ID 有)。

    print (pd.concat([df1, df2, df3, df4]).groupby('ID').first())
        Name   Age  LAN_NBR  Street     City State TYPE CLOSE_DATE
    ID                                                            
    1    ABC  24.0  G284992     NaN      NaN   NaN  HUB        NaN
    2   John   NaN      NaN  Wacker  Chicago    IL  HUB        NaN
    3    NaN   NaN      NaN     NaN      NaN   NaN  HUB   1/1/2021
    

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 1970-01-01
      • 2020-10-12
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2019-08-20
      相关资源
      最近更新 更多