【问题标题】:Dynamically update dataframe where conditions are provide through another dataframe动态更新通过另一个数据框提供条件的数据框
【发布时间】:2020-08-17 03:55:54
【问题描述】:

我有一个如下的输入数据框:

**ID  |  NAME  |  AGE  |  SALARY  |  TYPE**  
1  |  AB  |  26  |  33000  |  ABC  
2  |  CD  |  29  |  41000  |  DEF  
3  |  DE  |  26  |  53000  |  BCD  

我有另一个数据框,其中列出了更新输入数据框的条件:

**Column_to_be_updated  |  Value_to_be_update  |  COLUMN  |  OPERATOR  |  VALUE**  
TYPE  |  FFF  |  SALARY  |  >=  | 40000  
TYPE  |  GGG  |  AGE  |  <=  | 27

我想在输入数据帧上应用上述条件,我的预期输出是:

**ID  |  NAME  |  AGE  |  SALARY  |  TYPE**  
1  |  AB  |  26  |  33000  |  GGG  
2  |  CD  |  29  |  41000  |  FFF  
3  |  DE  |  26  |  53000  |  GGG  

有什么方法可以在 Python 中有效地做到这一点?

另外,我无法在表达式数据框中提供像 AND/OR 这样的逻辑运算符,如果您有任何想法/逻辑将其包含在表达式数据框中,然后基于此更新输入数据,那将解决我所有的问题。提前致谢!!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是我对df.eval 和np.where 的看法

    cond = df1.eval(df2[['COLUMN','OPERATOR','VALUE']].astype(str).agg(' '.join,1)).T
    vals = np.where(cond,df2['Value_to_be_update'],np.nan)
    
    m = pd.DataFrame(vals,columns=df2['Column_to_be_updated'].to_numpy())
    df1.loc[:,df2['Column_to_be_updated'].unique()] = m.groupby(m.columns,axis=1).last()
    

    print(df1)
    
       ID NAME  AGE  SALARY TYPE
    0   1   AB   26   33000  GGG
    1   2   CD   29   41000  FFF
    2   3   DE   26   53000  GGG
    

    【讨论】:

      【解决方案2】:

      试试:

      def execute_upd(base, chngs):
          for i,r in chngs.iterrows():
              base.loc[eval(f"base['{r['COLUMN']}']{r['OPERATOR']}{r['VALUE']}"), r['Column_to_be_updated']]=r['Value_to_be_update']
          return base
      

      现在假设 df1 是您的基础 df,df2 是有更新的:

      df1=execute_upd(df1,df2)
      

      输出:

      >>> df1
      
         ID NAME  AGE  SALARY TYPE
      0   1   AB   26   33000  GGG
      1   2   CD   29   41000  FFF
      2   3   DE   26   53000  GGG
      

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 2019-10-14
        • 2022-10-14
        • 2017-04-13
        • 1970-01-01
        • 2019-10-01
        • 2018-04-04
        • 2019-07-26
        • 1970-01-01
        相关资源
        最近更新 更多