【问题标题】:Compare two dataframes based on two columns and printing the matching values and grouping the matching values基于两列比较两个数据帧并打印匹配值并对匹配值进行分组
【发布时间】:2021-11-02 08:25:57
【问题描述】:

我有两个这样的数据框,

>>df1
  name key1 key2   A   B
0  a1  1    K0   A0   B0
1  a2  2    K1   A1   B1
2  a3  3    K0   A2   B2
3  a3  4    K1   A3   B3

>>df2
  key1 key2 
0   1   K0  
1   2   K0  
2   3   0K  
3   4   1K  

我需要将 df1 的 key1、key2 与 df2 进行比较,并且我必须打印匹配的行。在比较时我必须检查 df1['key1','key2'] == df2['key1','key2'] 或 df1['key1','key2'] == df2['key1',reverse(' key2')]

预期输出:

>>df3
      name key1 key2   A   B  
       a1  1    K0   A0   B0  
       a3  3    K0   A2   B2  
       a3  4    K1   A3   B3  
>>df4
      name key1 key2   A      B      
       a1  1    K0     A0     B0     
       a3  3,4  K0,K1  A2,A3  B2,B3  

【问题讨论】:

  • 请发布您的预期输出。您还可以包含您尝试过的内容

标签: python pandas dataframe


【解决方案1】:

试试:

x = df1.merge(df2, on=["key1", "key2"])
df2["key2"] = df2["key2"].str[::-1]
y = df1.merge(df2, on=["key1", "key2"])

df3 = pd.concat([x, y])
df4 = (
    df3.assign(key1=df3.key1.astype(str))
    .groupby("name", as_index=False)
    .agg(", ".join)
)

print(df3)
print(df4)

打印:

  name  key1 key2   A   B
0   a1     1   K0  A0  B0
0   a3     3   K0  A2  B2
1   a3     4   K1  A3  B3

  name  key1    key2       A       B
0   a1     1      K0      A0      B0
1   a3  3, 4  K0, K1  A2, A3  B2, B3

【讨论】:

    【解决方案2】:

    这是另一种方法:

    1. 为 key2 中的每个字符获取 ord 并将它们相加以创建一个辅助列。

    2. 然后在合并中使用此列。这将消除反转字符串的需要。


    f = lambda x: sum(map(ord,x))
    df4 = (df1.merge(df2,left_on=['key1',df1['key2'].map(f)],
                  right_on=['key1',df2['key2'].map(f)],suffixes=('','_y'))
     .loc[:,df1.columns]
    .groupby("name", as_index=False).agg(lambda x: ', '.join(x.map(str))))
    

    print(df4)
    
     name  key1    key2       A       B
    0   a1     1      K0      A0      B0
    1   a3  3, 4  K0, K1  A2, A3  B2, B3
    

    请注意,如果您从上面的代码中删除 groupby 操作,您会收到 df3。

    【讨论】:

      【解决方案3】:

      让我们试试MultiIndex.isin

      i1 = df1.set_index(['key1', 'key2']).index
      i2 = df2.set_index(['key1', 'key2']).index
      i3 = df2.set_index(['key1', df2['key2'].str[::-1]]).index
      
      df3 = df1[i1.isin(i2.union(i3))]
      df4 = df3.astype(str).groupby('name', as_index=False).agg(','.join)
      

      print(df3)
        name  key1 key2   A   B
      0   a1     1   K0  A0  B0
      2   a3     3   K0  A2  B2
      3   a3     4   K1  A3  B3
      
      print(df4)
        name key1   key2      A      B
      0   a1    1     K0     A0     B0
      1   a3  3,4  K0,K1  A2,A3  B2,B3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 2012-09-05
        • 2020-10-15
        相关资源
        最近更新 更多