【问题标题】:Merge by looking up multiple column values通过查找多个列值进行合并
【发布时间】:2021-06-22 20:15:50
【问题描述】:

我在 pandas 中有以下 2 个数据框形式的表;

这是所有可能组合的列表:

Table A:
   0    1    2
 +---+----+----+
0| A |None|None|
 +---+----+----+
1| B |None|None|
 +---+----+----+
2|...|    |    |
 +---+----+----+
3| A | C  | D  |
 +---+----+----+
4| B | C  | D  |
 +---+----+----+

这些是变量的相关值:

Table B:
  0   1
 +---+---+
0| A | 5 |
 +---+---+
1| B | 2 |
 +---+---+
2| C | 7 |
 +---+---+
3| D | 4 |
 +---+---+

我需要的是这样的:

   0    1    2   3
 +---+----+----+---+
0| A |None|None| 5 |
 +---+----+----+---+
1| B |None|None| 2 |
 +---+----+----+---+
2|...|    |    |   |
 +---+----+----+---+
3| A | C  | D  | 7 |
 +---+----+----+---+
4| B | C  | D  | 7 |
 +---+----+----+---+

通过在 Table A012 中的 Table B0 列中查找每个关联值并返回这些值中的最大值,可以找到第 3 列。

例如: 第 3 行显示了 ACD 的组合。因此列3Table B 中查找A,值为5,然后在Table B 中查找C,值为7。最后它在Table B 中查找D,其值为4。在这 3 个数字中,7 是最大的,所以它返回。

到目前为止我尝试过pandas.merge,但没有成功

更新: 我试过这个:

Final=df1.insert(3,column='min space',value=df1.join(df2.set_index(0),on=0).max())

但它只返回 None 并且不考虑 df1 中的多个列,如果我尝试添加多个列;[0,1,2] 它告诉我每个列需要相同数量的列

【问题讨论】:

    标签: python python-3.x pandas merge


    【解决方案1】:

    您可以将所有单元格转换为数字(通过关联的df),然后获取每行最大值的列。

    import pandas as pd
    df = pd.DataFrame({                 # original df
        0:['A', 'B', 'A', 'B',],
        1:[None, None, 'C', 'C',],
        2:[None, None, 'D', 'D',],
        })
    rdf = pd.DataFrame({                # associated values
        0:['A', 'B', 'C', 'D',],
        1:[5, 2, 7, 4,],
        })
    
    tdf = df                            # copy the original df
    rdf = rdf.set_index(0)[1]           # set index of rdf for next line
    tdf = tdf[tdf.columns].replace(rdf) # replace all values in tdf by rdf
    tdf[3] = tdf.max(axis=1)            # column[3] = max of each row
    df[3] = tdf[3]                      # add column[3] to original df
    
    print(df)
    
       0     1     2    3
    0  A  None  None  5.0
    1  B  None  None  2.0
    2  A     C     D  7.0
    3  B     C     D  7.0
    

    【讨论】:

      【解决方案2】:
      df1[3] = df2.merge(
          df1.stack(dropna=False).reset_index(0), how='outer'
      ).groupby('level_0').max()
      

      例子:

      >>> df1
           0    1    2
      0    A  NaN  NaN
      1    B  NaN  NaN
      2  ...  NaN  NaN
      3    A    C    D
      4    B    C    D
      
      >>> df2
         0  1
      0  A  5
      1  B  2
      2  C  7
      3  D  4
      
      >>> df1.columns
      Int64Index([0, 1, 2], dtype='int64')
      
      >>> df2.columns
      Int64Index([0, 1], dtype='int64')
      
      >>> df2[1].dtype
      dtype('int64')
      
      df1[3] = df2.merge(
          df1.stack(dropna=False).reset_index(0), how='outer'
      ).groupby('level_0').max()
      
      >>> df1
           0    1    2    3
      0    A  NaN  NaN  5.0
      1    B  NaN  NaN  2.0
      2  ...  NaN  NaN  NaN
      3    A    C    D  7.0
      4    B    C    D  7.0
      

      【讨论】:

      • 这会引发错误; mergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
      • 我添加了一个例子来展示它的工作原理。与您的示例 - 它应该自动合并 0 列。
      【解决方案3】:

      试试replace

      dfA['out'] = dfA.replace(dict(zip(dfB[0],dfB[1]))).max(1)
      dfA
      Out[487]: 
         0     1     2  out
      0  A  None  None  5.0
      1  B  None  None  2.0
      2  A     C     D  7.0
      3  B     C     D  7.0
      

      【讨论】:

      • 我需要在表格中保留字母 ID。
      【解决方案4】:

      试试这个..

      #!/usr/bin/env python3
      import pandas as pd
      
      A, B, C, D = 5, 2, 7, 4
      
      df = pd.DataFrame({
          0: [A, B, None, A, B],
          1: [None, None, None, C, C],
          2: [None, None, None, D, D]
          })
      
      df[3] = df.max(axis=1)
      

      输出:

           0    1    2    3
      0  5.0  NaN  NaN  5.0
      1  2.0  NaN  NaN  2.0
      2  NaN  NaN  NaN  NaN
      3  5.0  7.0  4.0  7.0
      4  2.0  7.0  4.0  7.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 2021-12-18
        相关资源
        最近更新 更多