Python 3.x 如何用条件填充pandas中的空单元格值
我的示例数据集如下所示。到2020年的实际数据可用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
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)