根据 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 数据帧合并或组合到另一个数据帧
Python Pandas根据多个其他列中的条件替换一列中的值[重复]