我有一个类似于以下内容的数据集:
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25.0
1 20-2020. BE. 101.0 4.0 50.0
2 20-2020. BE. 102.0 2.0 NaN
3 20-2020. BE. 102.0 4.0 NaN
4 20-2020. BE. 103.0 2.0 NaN
5 20-2020. BE. 103.0 4.0 NaN
6 20-2020. BE. 110.0 4.0 10.0
7 20-2020. BE. 111.0 4.0 12.0
我所缺少的是产品编号102和103。 我想使用产品101的价格来填写价格。
对于给定周(20-2020),国家(BE)和产品尺寸(2)的product_number(102)的含义,我想使用来自product_number(101)的等效数据来填充Selling_price。这意味着现在的售价应为25。相同的规则也应适用于商品编号103。
转换后的上表应如下所示:
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25
1 20-2020. BE. 101.0 4.0 50
2 20-2020. BE. 102.0 2.0 25
3 20-2020. BE. 102.0 4.0 50
4 20-2020. BE. 103.0 2.0 25
5 20-2020. BE. 103.0 4.0 50
6 20-2020. BE. 110.0 4.0 10
7 20-2020. BE. 111.0 4.0 12
我的方法是在表中循环,并连续索引我要查找的内容并替换值,但出现一些错误。 然后,我尝试将数据框设置为子集,更改值,然后重新分配。
我也一直在考虑np.where
,但我不知道如何通过上述条件。
答案 0 :(得分:1)
将产品编号为101
的数据帧切片,然后在将该数据帧的索引设置为selling_price
后选择列c
,以创建映射序列m
,最后使用此映射系列与Series.map
一起填充selling_price
列中的nan值:
c = ['week.', 'country.', 'product_size.']
m = df[df['product_number.'].eq(101)].set_index(c)['selling_price']
df['selling_price'] = df['selling_price'].fillna(
pd.Series(df.set_index(c).index.map(m), index=df.index))
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25.0
1 20-2020. BE. 101.0 4.0 50.0
2 20-2020. BE. 102.0 2.0 25.0
3 20-2020. BE. 102.0 4.0 50.0
4 20-2020. BE. 103.0 2.0 25.0
5 20-2020. BE. 103.0 4.0 50.0
6 20-2020. BE. 110.0 4.0 10.0
7 20-2020. BE. 111.0 4.0 12.0
答案 1 :(得分:1)
对我来说,最简单的解决方案通常是最有效的。在这里,我不会做任何忍者熊猫的事情,只是基本的循环和字典。
/C
答案 2 :(得分:0)
您可以在DataFrame上使用fillna方法,并将该方法指定为ffill(正向填充): 如果正在使用,请在jupyter笔记本上测试以下命令行:
for v in df[(df['product_number'] == 102) & (df['product_number'] == 103)].values:
df.fillna(method='ffill')