pandas 在 Dataframe 中使用groupby.apply()执行Lambda函数操作

iqxoj9l9  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(138)

我有一个DataFrame,看起来像这样:

构建它的代码是:

data = {'Position Date': ['2022-01-02',  '2022-01-02',  '2022-01-02',  '2022-01-02',  '2022-01-03',  '2022-01-03',  '2022-01-03',  '2022-01-03'],
 'Client': ['Client 1',  'Client 1',  'Client 2',  'Client 2',  'Client 1',  'Client 1',  'Client 2',  'Client 2'],
 'Product': ['Product 1',  'Product 4',  'Product 2',  'Product 3',  Product 1',  'Product 4',  'Product 2',  'Product 3'],
 'Buy Date': ['2022-05-02',  '2022-06-02',  '2022-03-12',  '2022-01-25',  '2022-05-02',  '2022-06-02',  '2022-03-12',  '2022-01-25'],
 'Position': [130, 5000, 120, 77, 150, 7000, 200, 100]}

df = pd.DataFrame(data).set_index(['Position Date', 'Client', 'Product', 'Buy Date'])

df['PL'] = df.groupby(level=['Client', 'Product', 'Buy Date']).diff().fillna(0)

因此,现在我需要创建一个新的列X,它将"当前日期" PL(索引0)除以最后一天的Position(索引-1)。
例如:在2022年1月3日,客户端1,产品1,x将为:
X = PL [索引0 ]/位置[-1]= 20/130
预期产出为:

由于第一天的值为0,其他值为:第20/130号、第2000/5000号、第80/120号、第23/77号决议
我试着像这样

df.groupby(level=['Client', 'Product', 'Buy Date']).apply(lambda x: x['PL'] / x['Position'].iloc[-1])

但我总是出错。

yqkkidmi

yqkkidmi1#

我会在这里使用索引:

df['output'] = df['PL'].div(df.loc[df.index[0][0], 'Position']
                              .reindex(df.droplevel('Position Date').index).values
                           )

输出:

Position      PL    output
Position Date Client   Product   Buy Date                              
2022-01-02    Client 1 Product 1 2022-05-02       130     0.0  0.000000
                       Product 4 2022-06-02      5000     0.0  0.000000
              Client 2 Product 2 2022-03-12       120     0.0  0.000000
                       Product 3 2022-01-25        77     0.0  0.000000
2022-01-03    Client 1 Product 1 2022-05-02       150    20.0  0.153846
                       Product 4 2022-06-02      7000  2000.0  0.400000
              Client 2 Product 2 2022-03-12       200    80.0  0.666667
                       Product 3 2022-01-25       100    23.0  0.298701

中间体:

df.loc[df.index[0][0], 'Position']

Client    Product    Buy Date  
Client 1  Product 1  2022-05-02     130
          Product 4  2022-06-02    5000
Client 2  Product 2  2022-03-12     120
          Product 3  2022-01-25      77
Name: Position, dtype: int64

(df.loc[df.index[0][0], 'Position']
   .reindex(df.droplevel('Position Date').index)
)

Client    Product    Buy Date  
Client 1  Product 1  2022-05-02     130
          Product 4  2022-06-02    5000
Client 2  Product 2  2022-03-12     120
          Product 3  2022-01-25      77
Client 1  Product 1  2022-05-02     130
          Product 4  2022-06-02    5000
Client 2  Product 2  2022-03-12     120
          Product 3  2022-01-25      77
Name: Position, dtype: int64

(df.loc[df.index[0][0], 'Position']
   .reindex(df.droplevel('Position Date').index)
   .values
)

array([ 130, 5000,  120,   77,  130, 5000,  120,   77])
w1e3prcc

w1e3prcc2#

df["X"] = df["PL"].div(df["Position"].shift(4)).fillna(0.0).values

其中,shift方法中的4Position Date列中一天内的产品总数(产品1、产品2、产品3和产品4

相关问题