Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何用条件填充pandas中的空单元格值_Python 3.x_Pandas_Dataframe_Row - Fatal编程技术网

Python 3.x 如何用条件填充pandas中的空单元格值

Python 3.x 如何用条件填充pandas中的空单元格值,python-3.x,pandas,dataframe,row,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

我的示例数据集如下所示。到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年开始推断每个项目2017年(及以后年份)
最终销售额
列数据。
在上述数据集中,2017年A2和A4的最终销售额不可用,但2016年可用。如果相应年份的最终销售额不可用,如何引入2016年数据(最终销售额)值

预期结果如下。谢谢

    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

看起来您希望在缺少数据的地方进行填充

您可以使用“fillna”完成此操作,它在pd.DataFrame对象上可用

在您的情况下,您只希望为每个项目进行正向填充,因此首先按项目分组,然后使用fillna。“pad”方法只是按顺序进行(因此我们首先排序)

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

对于我的工作,只需要排序
列,如有疑问的样本数据:

#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
像这样的

    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)

未对此进行测试,但应使您走上正确的道路

谢谢。是的,如果2016年A3缺失,则不会结转。我将尝试使用您的pandas版本,您可能需要使用sort_值而不是sortBrilliant想法。谢谢我不这么想:)是的,我必须使用
sort_值
猜测排序是必需的,因为项目列表是随机的,不像上面的例子。@Lilly-hmm,然后使用
df=df.sort_值(['Year','Item'])
如果您按'Item'分组,则无需按'Item'排序@tim654321-hmmm,可能会错过
    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)