首页 > 解决方案 > 向数据集添加一列,其值按组填充

问题描述

我有一个数据集,其中包含列:周、商店、商品编号和价格。我还有一个唯一编号数组,它们等于项目编号,但顺序不同。我想根据这些唯一数字向该数据集添加新列。首先,我需要按周对这个数据集进行分组并购物。然后在特定的一周和特定的商店中,我需要找到一个等于新列名的项目编号(唯一编号数组中的元素)。如果没有这样的字段,则填写 null。然后我应该用这个项目编号的价格填写特定一周和特定商店的所有字段。

这是我尝试过的一些代码,但它的运行速度很慢,因为行数非常大。

#real dataset
data2
weeks = data2['Week'].unique()

for k in range(len(Unique_number)):
    for i in range(len(weeks)):
        temp_array = data2.loc[data2["Week"] == weeks[i]]
        stores = temp_array['Shop'].unique()
        for j in range(len(stores)):
            temp_array2 = temp_array.loc[data2["Shop"] == stores[j]]
            price = temp_array2.loc[temp_array2["Item number"] == Unique_number[k], "Price"]
            if (price.empty):
                price = 0 
            else:
                price = price.values[0]
            data2.loc[(data2["Week"] == weeks[i]) & (data2["Shop"] == stores[j]),Unique_number[k]] = price

我想要这样的东西

Unique_numbers = [0,1,2,3]

dataframe before
week; shop; Item number; price
1     1     0            2
1     2     1            3
2     1     3            4
2     1     2            5
3     4     1            6
3     1     2            7



dataframe after
week; shop; Item number; price; 0; 1; 2; 3
1     1     0            2      2  0  0  0
1     2     1            3      0  3  0  0  
2     1     3            4      0  0  5  4
2     1     2            5      0  0  5  4
3     4     1            6      0  6  0  0
3     1     2            7      0  0  7  0

标签: pythonpandasnumpy

解决方案


设置

u = df['Item number'].to_numpy()
w = np.asarray(Unique_numbers)
g = [df.week, df.shop]

在这里使用一些广播比较(假设您的所有price值都大于0)。


pd.DataFrame(
  np.equal.outer(u, w) * df['price'].to_numpy()[:, None]).groupby(g).transform('max')

   0  1  2  3
0  2  0  0  0
1  0  3  0  0
2  0  0  5  4
3  0  0  5  4
4  0  6  0  0
5  0  0  7  0

推荐阅读