【发布时间】:2022-01-06 20:11:35
【问题描述】:
我使用以下数据框
df = pd.DataFrame({'class': 'a a aa aa b b '.split(),
'item': [5,5,7,7,7,6],
'last_PO_code': ['103','103','103','104','103','104'],
'qty': [5,4,7,6,7,6]
})
我需要为每个项目中的每个类对这个数据框应用规则。
- 如果所有 last_PO_code 都等于 103,则为真
- 如果 last_PO_code 包含 103 和 104 以及 103 的总和 > 104 的总和,则为真
- 如果 last_PO_code 等于 103 和 104 和 105 和 106 以及 104 的数量之和 == 103 和 105 == 106,则为 true
我编写了不能与 transform 一起使用的 lambda 函数
regle1 = lambda x: True if x['last_PO_code'].all() == "103" else False
regle2 = lambda x: x.loc[x['last_PO_code'].eq('103'), 'qty'].sum() \
> x.loc[x['last_PO_code'].eq('104'), 'qty'].sum()
regle3 = lambda x: x.loc[x['last_PO_code'].eq('105'), 'qty'].sum() \
== x.loc[x['last_PO_code'].eq('106'), 'qty'].sum()
df['regle1'] = df['class'].map(df.groupby(['class','item']).apply(regle1))
df['regle2'] = df['class'].map(df.groupby(['class','item']).apply(regle2))
df['regle3'] = df['class'].map(df.groupby(['class','item']).apply(regle3))
mask1 = df['regle2'] == True
mask2 = df['regle3'] == True
mask = mask1 & mask2
df['regle3'] = np.where(mask,True,False)
我想将其转换为如下函数以使用转换而不是应用
我成功使用了规则 1,但我无法使用其他规则进行管理
def regle1(x):
return (x == '103').all()
df['regle1'] = df.groupby(['class', 'item']).last_PO_code.transform(regle1)
【问题讨论】:
标签: python pandas dataframe lambda