按多列对数据帧进行分组以获取特定值

2024-05-16 21:00:07 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们描述一下我的问题

我从数据库中得到了很多数据。例如,它就像:

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个条形图,每个条形图代表一年的价格

对熊猫最好的方法是什么

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

所以问题是,如何得到我的轴的阴谋?你如何以最优雅的方式解决这个问题?就和熊猫在一起?可能吗

我很兴奋,非常感谢


Tags: 数据apple产品valuetag方式价格数组
2条回答

将数据子集到'Price'行中,然后使用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')

enter image description here

试试这个:

import numpy as np
import matplotlib.pyplot as plt
 
# set width of bar
barWidth = 0.25
fig = plt.subplots(figsize =(12, 8))
 
# set height of bar
Apple = list(df[(df.Product=='Apple')&(df.Tag=='Price')].Value)
Banana = list(df[(df.Product=='Banana')&(df.Tag=='Price')].Value)
Papaya = list(df[(df.Product=='Papaya')&(df.Tag=='Price')].Value)
 
# Set position of bar on X axis
br1 = np.arange(len(Apple))
br2 = [x + barWidth for x in br1]
br3 = [x + barWidth for x in br2]
 
# Make the plot
plt.bar(br1, Apple, color ='r', width = barWidth,
        edgecolor ='grey', label ='Apple')
plt.bar(br2, Banana, color ='g', width = barWidth,
        edgecolor ='grey', label ='Banana')
plt.bar(br3, Papaya, color ='b', width = barWidth,
        edgecolor ='grey', label ='Papaya')
 
# Adding Xticks
plt.xlabel('Year', fontweight ='bold', fontsize = 25)
plt.ylabel('Price', fontweight ='bold', fontsize = 25)
plt.xticks([r + barWidth for r in range(len(Apple))],['2019','2020','2021'])
 
plt.legend()
plt.show()

输出:


Bar Chart

相关问题 更多 >