我有两个数据帧,如下所示,我试图替换第一个数据帧中第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,我想检测数据可用的最早年份,并计算所有以前年份,其中Price0,从该点开始如下:

2018Japan中的产品DEF具有415中的price,是Price的最早可用数据点.因此2017price应该是415/(1+0.021)=406.464.在此之后,2016的值应为406.464/(1+0.021).计算这些值后,2019JapanDEF的值应为415+415*0.021=423.715.

对于其他国家,如South Africa,最早年份(2016)的价格是可用的,它应该更容易.例如,对于2017South 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

推荐答案

简单修复添加另一个for循环之后,这更像是对0的值进行正向填充和反向填充,因为我们需要步进,就像bfillffill链一样

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

df = df.iloc[::-1]
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 /(1+df2[(df2['Product']==rows['Product']) & (df2['Region']==rows['Region'])]['Average Yearly Price Growth'].values[0])
        except:
                    pass
df = df.iloc[::-1]
Out[88]: 
    Region       Country Product  Year  Price
0   Africa  South Africa     ABC  2016    500
1   Africa  South Africa     ABC  2017    400
2   Africa  South Africa     ABC  2018    417
3   Africa  South Africa     ABC  2019    450
4   Africa  South Africa     XYZ  2016    750
5   Africa  South Africa     XYZ  2017    759
6   Africa  South Africa     XYZ  2018    768
7   Africa  South Africa     XYZ  2019    890
8     Asia         Japan     DEF  2016    397
9     Asia         Japan     DEF  2017    406
10    Asia         Japan     DEF  2018    415
11    Asia         Japan     DEF  2019    423

Python相关问答推荐

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

如何使用html从excel中提取条件格式规则列表?

_repr_html_实现自定义__getattr_时未显示

运行终端命令时出现问题:pip start anonymous"

为一个组的每个子组绘制,

多处理队列在与Forking http.server一起使用时随机跳过项目

如何保持服务器发送的事件连接活动?

Pandas Data Wrangling/Dataframe Assignment

判断solve_ivp中的事件

python—telegraph—bot send_voice发送空文件

在Admin中显示从ManyToMany通过模型的筛选结果

交替字符串位置的正则表达式

Pandas—堆栈多索引头,但不包括第一列

将一个双框爆炸到另一个双框的范围内

如何在验证文本列表时使正则表达式无序?

pytest、xdist和共享生成的文件依赖项

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

普洛特利express 发布的人口普查数据失败

ValueError:必须在Pandas 中生成聚合值

将参数从另一个python脚本中传递给main(argv