gpt4 book ai didi

python - 将数量复制为新列

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

这是我的 table

enter image description here

我希望它是以下内容,即通过复制 (shopID, productID)Quantity 其他差异的 Quantity (shopID, productID) 作为新列,Quantity_shopID_productIDenter image description here

以下是我的代码:

from datetime import date 
import pandas as pd
df=pd.DataFrame({"Date":[date(2019,10,1),date(2019,10,2),date(2019,10,1),date(2019,10,2),date(2019,10,1),date(2019,10,2),date(2019,10,1),date(2019,10,2)],
"ShopID":[1,1,1,1,2,2,2,2],
"ProductID":[1,1,2,2,1,1,2,2],
"Quantity":[3,3,4,4,5,5,6,6]})


for sid in df.ShopID.unique():
for pid in df.ProductID.unique():
col_name='Quantity{}_{}'.format(sid,pid)
print(col_name)
df1=df[(df.ShopID==sid) & (df.ProductID==pid)][['Date','Quantity']]
df1.rename(columns={'Quantity':col_name}, inplace=True)
display(df1)
df=df.merge(df1, how="left",on="Date")
df.loc[(df.ShopID==sid) & (df.ProductID==pid),col_name]=None

print(df)

问题是,它的运行速度非常慢,因为我在 3 年的时间里有超过 108 种不同的 (shopID, productID) 组合。有什么方法可以提高效率吗?

最佳答案

方法 1:使用 pivot_tablejoin(矢量化解决方案)

我们可以将每个shopid、productidpivotquantity 到列,然后将它们连接回您的原始数据框。这应该比您的 forloops 快得多,因为这是一种矢量化方法:

piv = df.pivot_table(index=['ShopID', 'ProductID'], columns=['ShopID', 'ProductID'], values='Quantity')
piv2 = piv.ffill().bfill()
piv3 = piv2.mask(piv2.eq(piv))

final = df.set_index(['ShopID', 'ProductID']).join(piv3).reset_index()

输出

   ShopID  ProductID         dt  Quantity  (1, 1)  (1, 2)  (2, 1)  (2, 2)
0 1 1 2019-10-01 3 NaN 4.0 5.0 6.0
1 1 1 2019-10-02 3 NaN 4.0 5.0 6.0
2 1 2 2019-10-01 4 3.0 NaN 5.0 6.0
3 1 2 2019-10-02 4 3.0 NaN 5.0 6.0
4 2 1 2019-10-01 5 3.0 4.0 NaN 6.0
5 2 1 2019-10-02 5 3.0 4.0 NaN 6.0
6 2 2 2019-10-01 6 3.0 4.0 5.0 NaN
7 2 2 2019-10-02 6 3.0 4.0 5.0 NaN

方法二,使用GroupBymask,其中:

我们可以使用 GroupBy 来加速您的代码和 mask + where而不是两个 for 循环:

groups = df.groupby(['ShopID', 'ProductID'])

for grp, data in groups:
m = df['ShopID'].eq(grp[0]) & df['ProductID'].eq(grp[1])
values = df['Quantity'].where(m).ffill().bfill()
df[f'Quantity_{grp[0]}_{grp[1]}'] = values.mask(m)

输出

          dt  ShopID  ProductID  Quantity  Quantity_1_1  Quantity_1_2  Quantity_2_1  Quantity_2_2
0 2019-10-01 1 1 3 NaN 4.0 5.0 6.0
1 2019-10-02 1 1 3 NaN 4.0 5.0 6.0
2 2019-10-01 1 2 4 3.0 NaN 5.0 6.0
3 2019-10-02 1 2 4 3.0 NaN 5.0 6.0
4 2019-10-01 2 1 5 3.0 4.0 NaN 6.0
5 2019-10-02 2 1 5 3.0 4.0 NaN 6.0
6 2019-10-01 2 2 6 3.0 4.0 5.0 NaN
7 2019-10-02 2 2 6 3.0 4.0 5.0 NaN

关于python - 将数量复制为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58353594/

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