【问题标题】:how to use lambda function with transformation in pandas dataframe如何在熊猫数据框中使用 lambda 函数进行转换
【发布时间】: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]
                   })

我需要为每个项目中的每个类对这个数据框应用规则。

  1. 如果所有 last_PO_code 都等于 103,则为真
  2. 如果 last_PO_code 包含 103 和 104 以及 103 的总和 > 104 的总和,则为真
  3. 如果 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


    【解决方案1】:

    你的意思是这样的:

    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
    

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

    df2 = 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
    

    编辑:您可以添加计算列,例如 pd.merge()

    df.merge(df2.reset_index(), on = ['class','item'])
    
    #   class   item    last_PO_code    qty regle1  regle2  regle3
    #0  a       5       103             5   True    True    False
    #1  a       5       103             4   True    True    False
    #2  aa      7       103             7   False   False   False
    #3  aa      7       104             6   False   False   False
    #4  b       7       103             7   True    True    False
    #5  b       6       104             6   False   False   False
    #6  c       9       103             1   False   False   True
    #7  c       9       104             1   False   False   True
    #8  c       9       105             2   False   False   True
    #9  c       9       106             2   False   False   True
    

    【讨论】:

    • 感谢您的回答,但结果数据框并不好,因为它不包含所有结果行
    • 好的,但是一旦你有了,就很容易将它们添加到启动数据集(通过合并或映射)。我认为最大的问题是 lambda 函数。
    猜你喜欢
    • 2021-05-27
    • 2018-12-06
    • 1970-01-01
    • 2023-01-21
    • 2020-06-12
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多