Skip to main content
 首页 » 编程设计

python之计算以列表形式存储的项目的价格

2025年05月04日14think

我有一个 Dataframe,看起来像这样:Item-table

Date.    Item.      
10-sep.  X,Y,Z 
11-sep.  Y,Z 
12-sep.  Z 
13-sep.  Z,X 

还有另一个表,其中每件商品的价格按日期存储。价格表

Item.   10sep.  11sep.   12sep.  13sep 
X.       10.     5.        10.      15 
Y.        7.     15.       13.       10 
Z.        5.      10.       10.      10 

我希望我的输出看起来像这样:

Date.   Item.    Total Price 
10 sep.  X,Y,Z.   22 
11 sep.  Y,Z.     25 
12 sep.  Z.       10 
13 sep.  Z,X.     25 

第一行总点数为 22,因为 9 月 10 日 X、Y 和 Z 的价格分别为 10,7 和 5。我可以知道如何获得此输出列吗?

请您参考如下方法:

我将使用这个数据框来解决你的问题

print(df1) 
     Date          Item       
0  10-sep         X,Y,Z  
1  11-sep           Y,Z  
2  12-sep             Z  
3  13-sep           Z,X  
 
print(df2) 
  Item     10sep    11sep     12sep    13sep 
0    X        10        5        10       15 
1    Y         7       15        13       10 
2    Z         5       10        10       10 

我们可以使用DataFrame.lookup 选择数据框 2 的值,但首先我们必须准备值以进行搜索:

df3=df1.copy() 
df3['Item']=df3['Item'].str.split(',') 
df3=df3.explode('Item') 
df3['Date']=df3['Date'].str.replace('-','') 
print(df3) 
 
    Date Item 
0  10sep    X 
0  10sep    Y 
0  10sep    Z 
1  11sep    Y 
1  11sep    Z 
2  12sep    Z 
3  13sep    Z 
3  13sep    X 

mapper=df2.set_index('Item') 
 
 
print(mapper) 
      10sep  11sep  12sep  13sep 
Item                             
X        10      5     10     15 
Y         7     15     13     10 
Z         5     10     10     10 

df3['value']=mapper.lookup(df3['Item'],df3['Date']) 
df1['Total Price']=df3.groupby(level=0).value.sum() 
print(df1) 
     Date          Item  Total Price 
0  10-sep         X,Y,Z           22 
1  11-sep           Y,Z           25 
2  12-sep             Z           10 
3  13-sep           Z,X           25 

此数据帧的时间比较:

Valdi_Bo的方法:

%%timeit 
ItemPrice = Prices.set_index('Item').stack().swaplevel().rename('Price') 
def totalPrice(row): 
    dat = row.Date 
    items = row.Item.split(',') 
    ind = pd.MultiIndex.from_arrays([[dat] * len(items), items]) 
    return ItemPrice.reindex(ind).sum() 
Items['Total Price'] = Items.apply(totalPrice, axis=1) 
13.5 ms ± 699 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

我的方法

%%timeit 
df3=Items.copy() 
df3['Item']=df3['Item'].str.split(',') 
df3=df3.explode('Item') 
mapper=Prices.set_index('Item') 
df3['value']=mapper.lookup(df3['Item'],df3['Date']) 
Items['Total Price']=df3.groupby(level=0).value.sum() 
7.68 ms ± 178 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

@anky_91 方法

%%timeit 
m=df2.set_index('Item').T 
n=df1[['Date']].assign(**df1['Item'].str.get_dummies(',')).set_index('Date') 
final=df1.set_index('Date').assign(Total_Price=m.mul(n).sum(1)).reset_index() 
8.7 ms ± 199 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)