繁体   English   中英

如何使用 lambda function 与 pandas Z6A8064B5DF4794555500553C7

[英]how to use lambda function with transformation in pandas dataframe

我使用以下 dataframe

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]
                   })

我需要为每个项目中的每个 class 对这个 dataframe 应用规则。

  1. 如果所有 last_PO_code 都等于 103,则为 true
  2. 如果 last_PO_code 包含 103 和 104 并且数量总和 103 > 总数量 104,则为 true
  3. 如果 last_PO_code 等于 103 和 104 和 105 和 106 以及 104 == 103 和 105 == 106 的数量之和,则为 true

我已经编写了 lambda 函数,但不能与 transform 一起使用

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)


我想将其转换为 function 如下所示使用转换而不适用

我成功使用了规则 1,但我无法使用其他规则

def regle1(x):
      return (x == '103').all()


df['regle1'] = df.groupby(['class', 'item']).last_PO_code.transform(regle1)

你的意思是这样的:

regle1 = lambda x: True if x['last_PO_code'].eq('103').all() else False
regle2 = lambda x: True if x['last_PO_code'].eq('103').any() \
    and x['last_PO_code'].eq('103').any() \
    and x['last_PO_code'].eq('103').sum() > x['last_PO_code'].eq('104').sum() \
    else False
regle3 = lambda x: True if x['last_PO_code'].eq('103').any() \
    and x['last_PO_code'].eq('104').any() \
    and x['last_PO_code'].eq('105').any() \
    and x['last_PO_code'].eq('106').any() \
    and x['last_PO_code'].eq('103').sum() == x['last_PO_code'].eq('104').sum() \
    and x['last_PO_code'].eq('105').sum() == x['last_PO_code'].eq('106').sum() \
    else False

然后将它们应用于每个组:

df.groupby(['class','item']).apply(lambda x: pd.Series({'regle1' : regle1(x),
                                  'regle2': regle2(x),
                                  'regle3' : regle3(x)}))

为了

df = pd.DataFrame({'class': 'a a aa aa b b c c c c'.split(),
                    'item': [5,5,7,7,7,6,9,9,9,9],
                   'last_PO_code': ['103','103','103','104','103','104','103','104','105','106'],
                   'qty': [5,4,7,6,7,6,1,1,2,2]
                   })

它似乎工作正常:

                regle1  regle2  regle3
class   item            
a       5       True    False   False
aa      7       False   True    False
b       6       False   False   False
        7       True    False   False
c       9       False   False   True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM