gpt4 book ai didi

python - pandas dataframe 使用附加参数应用

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:13 28 4
gpt4 key购买 nike

以下示例:

df = pd.DataFrame({'signal':[1,0,0,1,0,0,0,0,1,0,0,1,0,0],'product':['A','A','A','A','A','A','A','B','B','B','B','B','B','B'],'price':[1,2,3,4,5,6,7,1,2,3,4,5,6,7],'price2':[1,2,1,2,1,2,1,2,1,2,1,2,1,2]})

我有一个函数“fill_price”来根据“信号”和“价格”创建一个新列“Price_B”。对于每个“产品”子组,如果“信号”为 1,则 Price_B 等于 Price。如果信号为 0,则 Price_B 等于上一行的 Price_B。如果子组以 0“信号”开始,则“price_B”将保持为 0,直到“信号'变为1。

目前我有:

def fill_price(df, signal,price_A):
p = df[price_A].where(df[signal] == 1)
return p.ffill().fillna(0).astype(df[price_A].dtype)

然后使用以下方法应用:

df['Price_B'] = fill_price(df,'signal','price')

但是,我想使用 df.groupby('product').apply() 将此 fill_price 函数分别应用于 'product' 列的两个子集,并将其应用于 'price' 和 'price2' 列。有人可以帮忙吗?

我基本上想做:

df.groupby('product',groupby_keys=False).apply(fill_price, 'signal','price2')

最佳答案

IIUC,您可以使用以下语法:

df['Price_B'] = df.groupby('product').apply(lambda x: fill_price(x,'signal','price2')).reset_index(level=0, drop=True)

输出:

    price  price2 product  signal  Price_B
0 1 1 A 1 1
1 2 2 A 0 1
2 3 1 A 0 1
3 4 2 A 1 2
4 5 1 A 0 2
5 6 2 A 0 2
6 7 1 A 0 2
7 1 2 B 0 0
8 2 1 B 1 1
9 3 2 B 0 1
10 4 1 B 0 1
11 5 2 B 1 2
12 6 1 B 0 2
13 7 2 B 0 2

您可以更简单地编写此代码,而无需额外的函数。

df['Price_B'] = (df.groupby('product',as_index=False)
.apply(lambda x: x['price2'].where(x.signal==1).ffill().fillna(0))
.reset_index(level=0, drop=True))

关于python - pandas dataframe 使用附加参数应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45445833/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com