nan值熊猫的条件数据摄取

时间:2020-09-24 12:34:03

标签: python pandas dataframe

我有一个类似于以下内容的数据集:

      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,但我不知道如何通过上述条件。

3 个答案:

答案 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')