按多列对 Pandas 数据框进行分组以获得特定值
Grouping Pandas Dataframe by multiple columns in order to get specific values
让我们描述一下我的问题。
我从数据库中得到了很多数据。例如它像:
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 个条形图,每个代表一年的价格。
使用 pandas 的最佳方法是什么?
目前我正在遍历所有数据,找到正确的数据并填充新数组,只是为了将新创建的数组放入我的绘图中。但这似乎不是理想的方式。
所以问题是,如何获取绘图的坐标轴?你如何以最优雅的方式解决这个问题?只是 pandas?可能吗?
我很兴奋,非常感谢
将您的数据子集到 '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')
试试这个:
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()
输出:
让我们描述一下我的问题。
我从数据库中得到了很多数据。例如它像:
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 个条形图,每个代表一年的价格。
使用 pandas 的最佳方法是什么?
目前我正在遍历所有数据,找到正确的数据并填充新数组,只是为了将新创建的数组放入我的绘图中。但这似乎不是理想的方式。
所以问题是,如何获取绘图的坐标轴?你如何以最优雅的方式解决这个问题?只是 pandas?可能吗?
我很兴奋,非常感谢
将您的数据子集到 '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')
试试这个:
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()
输出: