首页 > 解决方案 > 按多列对 Pandas Dataframe 进行分组以获得特定值

问题描述

让我们描述一下我的问题。

我从数据库中获取了大量数据。例如,它看起来像:

d = [
{'Tag': 'Weight', 'Value': 15, 'Product': 'Apple', 'Year': 2019 },
{'Tag': 'Weight', 'Value': 14, 'Product': 'Apple', 'Year': 2020 },
{'Tag': 'Weight', 'Value': 16, 'Product': 'Apple', 'Year': 2021 },
{'Tag': 'Weight', 'Value': 30, 'Product': 'Banana', 'Year': 2019 },
{'Tag': 'Weight', 'Value': 32, 'Product': 'Banana', 'Year': 2020 },
{'Tag': 'Weight', 'Value': 31, 'Product': 'Banana', 'Year': 2021 },
{'Tag': 'Weight', 'Value': 120, 'Product': 'Papaya', 'Year': 2019 },
{'Tag': 'Weight', 'Value': 140, 'Product': 'Papaya', 'Year': 2020 },
{'Tag': 'Weight', 'Value': 130, 'Product': 'Papaya', 'Year': 2021 },
{'Tag': 'Price', 'Value': 0.23, 'Product': 'Apple', 'Year': 2019 },
{'Tag': 'Price', 'Value': 0.23, 'Product': 'Apple', 'Year': 2020 },
{'Tag': 'Price', 'Value': 0.24, 'Product': 'Apple', 'Year': 2021 },
{'Tag': 'Price', 'Value': 0.81, 'Product': 'Banana', 'Year': 2019 },
{'Tag': 'Price', 'Value': 0.83, 'Product': 'Banana', 'Year': 2020 },
{'Tag': 'Price', 'Value': 0.9, 'Product': 'Banana', 'Year': 2021 },
{'Tag': 'Price', 'Value': 2.31, 'Product': 'Papaya', 'Year': 2019 },
{'Tag': 'Price', 'Value': 2.29, 'Product': 'Papaya', 'Year': 2020 },
{'Tag': 'Price', 'Value': 2.41, 'Product': 'Papaya', 'Year': 2021 }
]

我用这个命令创建了一个数据框:

df = pd.DataFrame(data = d)

然后数据看起来像:

     Tag    Value   Product Year
0   Weight  15.00   Apple   2019
1   Weight  14.00   Apple   2020
2   Weight  16.00   Apple   2021
3   Weight  30.00   Banana  2019
4   Weight  32.00   Banana  2020
5   Weight  31.00   Banana  2021
6   Weight  120.00  Papaya  2019
...

到目前为止一切顺利。现在我想对这个数据框进行排序和过滤以制作漂亮的图。例如,我想显示过去几年的价格(Tag == 'Price')。这意味着在我的 X 轴上我想拥有所有产品,在 y 轴上我有相应的价格。例如,我希望每年都有一个单独的数据集,并标有那一年。在此条形图中的示例中,我为每种产品获得 3 个条形,每个代表一年的价格。

用熊猫做这件事的最好方法是什么?

目前我正在遍历所有数据,找到正确的数据并填充新数组,只是为了将新创建的数组放入我的绘图中。但这似乎不是理想的方式。

所以问题是,如何获得我的绘图轴?你是如何以最优雅的方式解决这个问题的?只用熊猫?可能的?

我很兴奋,非常感谢

标签: pythonpandassortingplotgrouping

解决方案


将您的数据子集到'Price'行中,然后用 a 重塑,pivot以便组织适合绘制条形图 - 每个产品的行和每年的列。

dfp = (df[df['Tag'].eq('Price')]
          .pivot(index='Product', columns='Year', values='Value'))
#Year     2019  2020  2021
#Product                  
#Apple    0.23  0.23  0.24
#Banana   0.81  0.83  0.90
#Papaya   2.31  2.29  2.41

dfp.plot(kind='bar', rot=0, ec='k')

在此处输入图像描述


推荐阅读