【问题标题】:Mapping different data frames based on multiple conditions in pandas df根据 pandas df 中的多个条件映射不同的数据帧
【发布时间】:2021-11-26 13:56:50
【问题描述】:

我有一个 df,我需要根据某些条件生成一列。

Sample_df

No.        Value1          Value2
1          AS              DS
2          AS              BS
3          Product         -
4                          AS
5          Tactical        VS

我还有 2 个具有值的 df,我想将其映射进去。

另一个df看起来像: df2

Value1          Num
AS              Des
AS              Des
Product         P

df3

Value2 Num
DS     Des
AS     Bed
BS     Ged
VS     Vis

规则: 在 Sample_df 中,列 value1 应该映射 df2 中的所有值,但如果 战术 来了,那么它应该使用 value2 df 来映射值。

Desired Output
No.        Value1          Value2        NewCol
1          AS              DS            Des
2          AS              BS            Des
3          Product         -             P
4                          AS            -
5          Tactical        VS            Vis

【问题讨论】:

    标签: pandas dataframe mapping


    【解决方案1】:

    您可以使用 pandas 的 .apply 与条件 lambda 语句一起实现此目的。

    我实现了一个辅助函数conditional,只是因为有些东西没有对应的映射,以及多个映射,这使得行为有点古怪

    import pandas as pd
    
    def conditional(r):
      if isinstance(r,pd.Series) and r.size == 0:
        return '-' 
      else:
        if r.size > 1:
          return r.at[0]
        else: 
          return r.tolist()[0]
    
    Sample_df['Value3'] = Sample_df.apply(lambda row: conditional(df2.loc[df2['Value1'] == row.Value1]['Num'])
                            if row.Value1 != 'Tactical' 
                            else conditional(df3.loc[df3['Value2'] == row.Value2]['Num']), axis = 1)
    

    提供的代码只是在您的原始 DataFrame 上添加一列,如果您不希望这样做,您可以先复制然后应用。

    
    from copy import copy
    new_df = copy(Sample_df)
    new_df['Value3'] = Sample_df.apply(lambda row: conditional(df2.loc[df2['Value1'] == row.Value1]['Num'])
                            if row.Value1 != 'Tactical' 
                            else conditional(df3.loc[df3['Value2'] == row.Value2]['Num']), axis = 1)
    

    获得的输出:

    1   AS          DS  Des
    2   AS          DS  Des
    3   Product     -   P
    4               AS  -
    5   Tactical    VS  Vis
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2023-03-21
      • 1970-01-01
      • 2019-10-17
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多