我的样本数据集如下。可以提供到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
答案 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)
没有测试,但是应该设置正确的路径