【问题标题】:extracting values from dataframe1 using conditions set in dataframe2 (pandas, python)使用 dataframe2 (pandas, python) 中设置的条件从 dataframe1 中提取值
【发布时间】:2020-06-09 16:23:12
【问题描述】:

我有两个日期帧(df1 和 df2),我试图弄清楚如何使用 df2 中的条件从 df1 中提取值并在 df2 中使用提取的值。

df1 = 精确值

df2 = 使用提取值的精确条件和 df

条件:df2.HJ = df1HJ & df2.JK = df1 P colum

示例if df2(df2.HJ = 99 & df2.JK = P3); Ans = 67 (from df1)

df1

╔════╦════╦══════╦══════╦══════╦══════╗ ║ HJ ║ P1 ║ P2 ║ P3 ║ P4 ║ P5 ║ ╠════╬════╬══════╬══════╬══════╬══════╣ ║ 5 ║ 51 ║ 33 ║ 21 ║ 31 ║ 13 ║ ║ 11 ║ 66 ║ 45 ║ 21 ║ 49 ║ 58 ║ ║ 21 ║ 7 ║ 55 ║ 56 ║ 67 ║ 73 ║ ║ 99 ║ 0 ║ 76 ║ 67 ║ 98 ║ 29 ║ ║ 15 ║ 11 ║ 42 ║ 79 ║ 27 ║ 54 ║ ╚════╩════╩══════╩══════╩══════╩══════╝

df2

╔════╦════╗ ║ HJ ║ JK ║ ╠════╬════╣ ║ 99 ║ P1 ║ ║ 11 ║ P5 ║ ║ 5 ║ P3 ║ ║ 21 ║ P2 ║ ║ 11 ║ P3 ║ ╚════╩════╝

从 df1 提取后 df2 的预期结果

╔════╦════╦═══════╗ ║ HJ ║ JK ║ Ans ║ ╠════╬════╬═══════╣ ║ 99 ║ P1 ║ 0 ║ ║ 11 ║ P5 ║ 58 ║ ║ 5 ║ P3 ║ 21 ║ ║ 21 ║ P2 ║ 55 ║ ║ 11 ║ P3 ║ 21 ║ ╚════╩════╩═══════╝

df1 的代码

import pandas as pd
import numpy as np
data = {'HJ':[5,11,21,99,15],
'P1':[51,66,7,0,11]
,'P2':[ 33,45,55 ,76 ,42]
,'P3':[ 21 ,21 ,56 ,67 ,79]
,'P4':[ 31 ,49 ,67 ,98 ,27]
,'P5':[ 13 ,58 ,73 ,29 ,54]}
df1 = pd.DataFrame(data)

df2 的代码

data = {'HJ':[99,11,5,21,11],
'JK':['P1','P5','P3','P2','P3']}
df2 = pd.DataFrame(data)

问候 谢谢

============

更新

@Scott Boston 的解决方案有效:

df2['ans'] = df1.set_index('HJ').lookup(df2['HJ'], df2['JK']) 

但是,如果没有找到标签,则会出现 KeyError: 'One or more row labels was not found'。有没有办法克服这个问题?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    set_index之后使用pd.DataFrame.lookup

    df2['ans'] = df1.set_index('HJ').lookup(df2['HJ'], df2['JK'])
    print(df2)
    

    输出:

       HJ  JK  ans
    0  99  P1    0
    1  11  P5   58
    2   5  P3   21
    3  21  P2   55
    4  11  P3   21
    

    使用查找,您必须先过滤输入以进行查找:

    df2m = df2[df2['HJ'].isin(df1['HJ']) & df2['JK'].isin(df1.columns)].copy()
    
    df2m['ans'] = df1.set_index('HJ').lookup(df2m['HJ'],df2m['JK'])
    
    df2.update(df2m)
    
    df2m.combine_first(df2)
    

    【讨论】:

    • 感谢您的解决方案。如果两个 df 都具有重复的标签,则效果很好,但是,当找不到标签时,会出现 KeyError: 'One or more row labels was not found'。有没有办法克服这个问题?我已经在我原来的问题中更新了这个
    • 使用查找,您需要先过滤输入以查找
    【解决方案2】:

    使用pd.meltpd.merge 的替代解决方案:

    d1 = pd.melt(df1, id_vars=['HJ'], var_name='JK', value_name='Ans')
    df = pd.merge(df2, d1, on=['HJ', 'JK'], how='left')
    

    # print(df)
    
       HJ  JK  Ans
    0  99  P1    0
    1  11  P5   58
    2   5  P3   21
    3  21  P2   55
    4  11  P3   21
    

    【讨论】:

    【解决方案3】:

    这一行足以解决您的问题: (相信我,它有效!我试过了)

    df2['Ans'] = [ df1[df2['JK'][i]][list(df1['HJ']).index(df2['HJ'][i])] for i in range(len(df2['JK']))]
    

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      您可以在此处使用pd.Index.get_indexer

      df1.set_index('HJ',inplace=True)
      row = df1.index.get_indexer(df2['HJ'])
      col = df1.columns.get_indexer(df2['JK'])
      
      df2['Ans'] = df1.to_numpy()[row,col] #df1.values[row,col]
      df2
         HJ  JK  Ans
      0  99  P1    0
      1  11  P5   58
      2   5  P3   21
      3  21  P2   55
      4  11  P3   21
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-18
        • 2021-05-01
        • 1970-01-01
        • 2021-12-03
        • 2021-09-17
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        相关资源
        最近更新 更多