我有两个数据帧,如下所示,我试图替换第一个数据帧中第Price
列的0
个值.
第一个数据帧如下所示:
Region | Country | Product | Year | Price |
---|---|---|---|---|
Africa | South Africa | ABC | 2016 | 500 |
Africa | South Africa | ABC | 2017 | 400 |
Africa | South Africa | ABC | 2018 | 0 |
Africa | South Africa | ABC | 2019 | 450 |
Africa | South Africa | XYZ | 2016 | 750 |
Africa | South Africa | XYZ | 2017 | 0 |
Africa | South Africa | XYZ | 2018 | 0 |
Africa | South Africa | XYZ | 2019 | 890 |
Asia | Japan | DEF | 2016 | 0 |
Asia | Japan | DEF | 2017 | 0 |
Asia | Japan | DEF | 2018 | 415 |
Asia | Japan | DEF | 2019 | 0 |
它包含给定年份每个国家每种产品的价格.由于数据缺失,一些国家某些年份的数值为0
.
第二个数据帧包含每个地区和产品的年平均价格增长,如下所示.
Region | Product | Average Yearly Price Growth |
---|---|---|
Africa | ABC | 0.043 |
Africa | DEF | 0.071 |
Africa | XYZ | 0.0128 |
Asia | XYZ | 0.05 |
Asia | ABC | -0.009 |
Asia | DEF | 0.021 |
任务是将第一个数据帧中的所有0
个值替换为该特定国家特定产品的上一年值,再加上平均年增长率(假设最早的数据点可用).
对于Japan
中的产品DEF
,我想检测数据可用的最早年份,并计算所有以前年份,其中Price
是0
,从该点开始如下:
2018
中Japan
中的产品DEF
具有415
中的price
,是Price
的最早可用数据点.因此2017
的price
应该是415/(1+0.021)=406.464
.在此之后,2016
的值应为406.464/(1+0.021)
.计算这些值后,2019
中Japan
中DEF
的值应为415+415*0.021=423.715
.
对于其他国家,如South Africa
,最早年份(2016
)的价格是可用的,它应该更容易.例如,对于2017
中South Africa
的产品XYZ
,值应为750+750*0.0128=759.6
,而不是0
.其中750
是该产品在该国的上一年价值,0.0128
是该产品在非洲的平均年价格增长(来自数据框2).
然后,对于2018年的同一产品,该值应为之前计算的759.6+759.6*0.0128=769.32
.
以下是示例数据:
data1 = {'Region': ['Africa','Africa','Africa','Africa','Africa','Africa','Africa','Africa','Asia','Asia','Asia','Asia'],
'Country': ['South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','South Africa','Japan','Japan','Japan','Japan'],
'Product': ['ABC','ABC','ABC','ABC','XYZ','XYZ','XYZ','XYZ','DEF','DEF','DEF','DEF'],
'Year': [2016, 2017, 2018, 2019,2016, 2017, 2018, 2019,2016, 2017, 2018, 2019],
'Price': [500, 400, 0,450,750,0,0,890,0,0,415,0]}
data2 = {'Region': ['Africa','Africa','Africa','Asia','Asia','Asia'],
'Product': ['ABC','DEF','XYZ','XYZ','ABC','DEF'],
'Average Yearly Price Growth': [0.043, 0.071, 0.0128,0.05,-0.009,0.021]}
df = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
到目前为止,我的代码如下,但它只适用于earlies可用点可用的情况,例如South Africa
.关于如何处理像Japan
这样的情况有什么 idea 吗?
for index,rows in df.iterrows():
if rows['Price']==0:
try:
past_year_value = df[(df['Country']==rows['Country']) & (df['Product']==rows['Product']) & (df['Region']==rows['Region']) & (df['Year']==rows['Year']-1)]['Price'].values[0]
df.at[index,'Price'] = past_year_value + past_year_value*df2[(df2['Product']==rows['Product']) & (df2['Region']==rows['Region'])]['Average Yearly Price Growth'].values[0]
except:
pass