【问题标题】:How to merge Pandas dataframes without duplicating columns如何在不重复列的情况下合并 Pandas 数据框
【发布时间】:2019-06-26 12:25:07
【问题描述】:

我有以下形式的数据:

frame1 = pd.DataFrame({'supplier1_match0': ['x'], 'id': [1]})
frame2 = pd.DataFrame({'supplier1_match0': ['2x'], 'id': [2]})

并希望像这样将多个框架连接到一个框架:

base_frame = pd.DataFrame({'id':[1,2,3]})

我在 id 上合并并得到:

merged = base_frame.merge(frame1, how='left', left_on='id', right_on='id')
merged = merged.merge(frame2, how='left', left_on='id', right_on='id')

   id supplier1_match0_x supplier1_match0_y
0   1                  x                NaN
1   2                NaN                 2x
2   3                NaN                NaN

列被复制并附加了一个“y”。这是我需要的:

id, supplier1_match0, ...
1,  x
2,  2x
3, NaN

有没有简单的方法来实现这一点?有一个类似的问题 (Nested dictionary to multiindex dataframe where dictionary keys are column labels),但数据的形状不同。请注意,我有多个供应商并且他们有不同数量的匹配项,所以我不能假设数据将具有“矩形”形状。提前致谢。

【问题讨论】:

  • 索引的长度和顺序是否相同?

标签: python pandas merge


【解决方案1】:
newdf_merge= pd.merge(pd.DataFrame(df1), pd.DataFrame(df2), left_on=['common column name from df1'],right_on=['common column name from df2'],how='left')

它对我有用,因此想在这里分享它

【讨论】:

    【解决方案2】:

    你的问题是你真的不想只是merge 一切。你需要concat你的第一组帧,然后合并。

    import pandas as pd
    import numpy as np
    
    base_frame.merge(pd.concat([frame1, frame2]), how='left')
    
    #   id supplier1_match0
    #0   1                x
    #1   2               2x
    #2   3              NaN
    

    或者,您可以定义base_frame,使其包含其他框架的所有相关列,并将id 设置为索引并使用.update。这确保了base_frame 的大小保持不变,而上面的大小则不然。尽管如果给定单元格有多个非空值,则数据将被覆盖。

    base_frame = pd.DataFrame({'id':[1,2,3]}).assign(supplier1_match0 = np.NaN).set_index('id')
    
    for df in [frame1, frame2]:
        base_frame.update(df.set_index('id'))
    
    print(base_frame)
    
       supplier1_match0
    id                 
    1                 x
    2                2x
    3               NaN
    

    【讨论】:

    • 完美,谢谢!我不知道 DataFrame.update
    猜你喜欢
    • 2020-08-28
    • 2017-03-27
    • 2015-05-17
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多