首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据三个条件划分多列

如何根据三个条件划分多列
EN

Stack Overflow用户
提问于 2021-02-23 23:32:42
回答 1查看 35关注 0票数 2

这是我的数据集,我有不同的国家,不同的型号,不同的国家,年份以及价格和数量。

代码语言:javascript
复制
data_dic = {
    "Country" : [1,1,1,1,2,2,2,2],
    "Model" : ["A","B","B","A","A","B","B","A"],
    "Year": [2005,2005,2020,2020,2005,2005,2020,2020],
    "Price" : [100,172,852,953,350,452,658,896],
    "Volume" : [4,8,9,10,12,6,8,9]
}

    Country Model   Year    Price   Volume
0   1   A   2005    100 4
4   2   A   2005    350 12
3   1   A   2020    953 10
7   2   A   2020    896 9
1   1   B   2005    172 8
5   2   B   2005    452 6
2   1   B   2020    852 9
6   2   B   2020    658 8

我想获得以下内容,其中1)列“分区_价格“是模式A的国家1在2005至2020年间的价格划分,以及2)列”划分_数量“是模式A的国家1在2005至2020年间的数量划分。

代码语言:javascript
复制
data_dic2 = {
    "Country" : [1,1,1,1,2,2,2,2],
    "Model" : ["A","B","B","A","A","B","B","A"],
    "Year": [2005,2005,2020,2020,2005,2005,2020,2020],
    "Price" : [100,172,852,953,350,452,658,896],
    "Volume" : [4,8,9,10,12,6,8,9],
    "Division_Price": [0.953,4.95,4.95,0.953,2.56,1.45,1.45,2.56],
    "Division_Volume": [2.5,1.125,1.125,2.5,1,1.33,1.33,1],
}
print(data_dic2)



Country Model   Year    Price   Volume  Division_Price  Division_Volume
0   1   A   2005    100 4   0.953   2.500
4   2   A   2005    350 12  2.560   1.000
3   1   A   2020    953 10  0.953   2.500
7   2   A   2020    896 9   2.560   1.000
1   1   B   2005    172 8   4.950   1.125
5   2   B   2005    452 6   1.450   1.330
2   1   B   2020    852 9   4.950   1.125
6   2   B   2020    658 8   1.450   1.330

我的整个数据集最多有50个国家和地区,我有最多10个模型,年限从1990年到2030年。我仍然不确定如何解释三列的多个条件,以便根据三个条件(即国家、年份和型号)自动划分列的价格和数量?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 00:08:14

您可以使用以下命令尝试以下操作df.pivotdf.stack()df.merge

代码语言:javascript
复制
>>> df2 = ( df.pivot(['Year'], columns=['Model', 'Country'], values=['Price', 'Volume'])
              .diff().bfill(downcast='infer').abs().stack().stack()
              .sort_index(level=-1).add_prefix('Difference_')
          )
>>> df2
                    Difference_Price  Difference_Volume
Year Country Model                                     
2005 1       A                   853                  6
     2       A                   546                  3
2020 1       A                   853                  6
     2       A                   546                  3
2005 1       B                   680                  1
     2       B                   206                  2
2020 1       B                   680                  1
     2       B                   206                  2

>>> df.merge(df2, on=['Country', 'Model', 'Year'], how='right')

   Country Model  Year  Price  Volume  Difference_Price  Difference_Volume
0        1     A  2005    100       4               853                  6
1        2     A  2005    350      12               546                  3
2        1     A  2020    953      10               853                  6
3        2     A  2020    896       9               546                  3
4        1     B  2005    172       8               680                  1
5        2     B  2005    452       6               206                  2
6        1     B  2020    852       9               680                  1
7        2     B  2020    658       8               206                  2

编辑:

对于您的新数据帧,我认为0.953将会是9.530,如果是这样,您可以使用pct_change然后加1:

代码语言:javascript
复制
>>> df2 = ( df.pivot(['Year'], columns=['Model', 'Country'], values=['Price', 'Volume'])
              .pct_change(1).add(1).bfill(downcast='infer').abs().stack().stack()
              .sort_index(level=-1).add_prefix('Division_').round(3)
          )
>>> df2
                      Division_Price    Division_Volume
Year Country Model                                     
2005 1       A                 9.530              2.500
     2       A                 2.560              0.750
2020 1       A                 9.530              2.500
     2       A                 2.560              0.750
2005 1       B                 4.953              1.125
     2       B                 1.456              1.333
2020 1       B                 4.953              1.125
     2       B                 1.456              1.333

>>> df.merge(df2, on=['Country', 'Model', 'Year'], how='right')
 
   Country Model  Year  Price  Volume    Division_Price    Division_Volume
0        1     A  2005    100       4             9.530              2.500
1        2     A  2005    350      12             2.560              0.750
2        1     A  2020    953      10             9.530              2.500
3        2     A  2020    896       9             2.560              0.750
4        1     B  2005    172       8             4.953              1.125
5        2     B  2005    452       6             1.456              1.333
6        1     B  2020    852       9             4.953              1.125
7        2     B  2020    658       8             1.456              1.333
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66336145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档