根据 pandas df 中的多个条件映射不同的数据帧

Posted

技术标签:

【中文标题】根据 pandas df 中的多个条件映射不同的数据帧【英文标题】:Mapping different data frames based on multiple conditions in 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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于根据 pandas df 中的多个条件映射不同的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

pandas筛选

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

将多个键上的 pandas 数据帧映射为列或 multiIndex

根据条件突出显示 panda df 错误

pandas - 根据条件添加列