如何用条件填充熊猫中的空单元格值

时间:2019-11-05 06:37:38

标签: python-3.x pandas dataframe row

我的样本数据集如下。可以提供到2020年的实际数据。

    Item  Year    Amount  final_sales
    A1    2016    123     400
    A2    2016    23      40
    A3    2016    6       
    A4    2016    10      100
    A5    2016    5       200
    A1    2017    123     400
    A2    2017    23      
    A3    2017    6       
    A4    2017    10      
    A5    2017    5       200

如果没有2017年的数据,我必须对2016年的final_sales列数据进行推断(对于每个项目)。
在以上数据集中,final_sales在A2和A4的2017年不可用,但在2016年可用。如果相应年份的final_sales不可用,如何引入2016年数据(final_sales)?

预期结果如下。谢谢。

    Item  Year    Amount  final_sales
    A1    2016    123     400
    A2    2016    23      40
    A3    2016    6       
    A4    2016    10      100
    A5    2016    5       200
    A1    2017    123     400
    A2    2017    23      40
    A3    2017    6       
    A4    2017    10      100
    A5    2017    5       200

3 个答案:

答案 0 :(得分:1)

您似乎想在缺少数据的地方继续填写。

您可以使用“ fillna”来执行此操作,该方法在pd.DataFrame对象上可用。

在您的情况下,您只想为每个项目进行填写,因此请先按项目分组,然后再使用fillna。 “ pad”方法只是按顺序进行(因此为什么要先排序)。

df['final_sales'] = df.sort_values('Year').groupby('Item')['final_sales'].fillna(method='pad')

请注意,在您的示例数据中,2016年也缺少A3,因此没有任何可继承的内容,而2017年仍然没有。

答案 1 :(得分:0)

对我来说,GroupBy.ffill的工作只需要排序Year列,例如有问题的样本数据:

#if necessary sorting by both columns
df = df.sort_values(['Year', 'Item'])
df['final_sales'] = df.groupby('Item')['final_sales'].ffill()
print (df)
  Item  Year  Amount  final_sales
0   A1  2016     123        400.0
1   A2  2016      23         40.0
2   A3  2016       6          NaN
3   A4  2016      10        100.0
4   A5  2016       5        200.0
5   A1  2017     123        400.0
6   A2  2017      23         40.0
7   A3  2017       6          NaN
8   A4  2017      10        100.0
9   A5  2017       5        200.0

答案 2 :(得分:0)

是这样吗?:

    def fill_final(x):
        if x['year'] != 2016:
            return df[(df['year'] == 2016) & (df['Item'] == x['Item'])]['final_sales']
        else: return x['final_sales']
    df['final_sales'] = df.apply(lambda x: fill_final(x), axis = 1)

没有测试,但是应该设置正确的路径