【问题标题】:merge two pandas dataframes without duplicating items合并两个熊猫数据框而不重复项目
【发布时间】:2022-01-10 00:48:08
【问题描述】:

我有两个数据框

left = pd.DataFrame(
    {"K": ["K0", "K0", "K1", "K2"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]}
)

right = pd.DataFrame(
    {"K": ["K0", "K0", "K0", "K2"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"]}
)

    K   A   B
0  K0  A0  B0
1  K0  A1  B1
2  K1  A2  B2
3  K2  A3  B3

    K   C   D
0  K0  C0  D0
1  K0  C1  D1
2  K0  C2  D2
3  K2  C3  D3

我想将它们组合成一个数据帧,以便只考虑两个数据帧中存在键的行:

   K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A2  B2  C3  D3

如果我使用 pandas.merge,我总是会得到重复的行。有没有简单的方法来实现这一点?

【问题讨论】:

  • 您有重复的密钥。你想合并什么?

标签: python pandas dataframe merge


【解决方案1】:

枚举键,然后合并键和枚举:

(left.assign(enum=left.groupby('K').cumcount())
     .merge(right.assign(enum=right.groupby('K').cumcount()),
            on=['K', 'enum'])
     .drop('enum', axis=1)
)

输出:

    K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A3  B3  C3  D3

【讨论】:

    【解决方案2】:

    使用 pd.concat

    data1="""Index  K   A   B
    0  K0  A0  B0
    1  K0  A1  B1
    2  K1  A2  B2
    3  K2  A3  B3"""
    
    data2="""K   C   D
    0  K0  C0  D0
    1  K0  C1  D1
    2  K0  C2  D2
    3  K2  C3  D3"""
    
    data1 = pd.read_table(StringIO(data1), sep='\s+')
    data1 = data1.rename(columns={'K':'K1'})
    
    data2 = pd.read_table(StringIO(data2), sep='\s+')
    data2 = data2.rename(columns={'K':'K2'})
    data  = pd.concat([data1, data2], axis=1)
    
    
    #print(data1,data2)
    data = data.drop(data[data.K1 != data.K2].index, axis=0)
    data.drop('K2',axis=1,inplace=True)
    print(data)
    

    输出

       Index  K1   A   B   C   D
    0      0  K0  A0  B0  C0  D0
    1      1  K0  A1  B1  C1  D1
    3      3  K2  A3  B3  C3  D3
    

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多