当组值未唯一标识时,如何在 pandas 中创建堆积条
How to create a stacked bar in pandas when the group values aren't uniquely identified
这个问题可能看起来很简单,但我在任何地方都没有见过这个问题,因为我是 python 的新手,所以我不知道如何解决这个问题。
我正在尝试根据此数据框绘制堆积条形图:
A R
208 1
208 5
208 2
210 9
213 5
213 8
213 6
213 3
213 3
215 6
222 4
我尝试使用以下代码:
df.set_index('A', inplace=True)
df['R'].plot.bar(legend=True, stacked=True)
这导致
但我希望 x 轴上的相同值像这样堆叠:
我该怎么做?
- 如果不将数据帧转换为宽格式就无法完成此操作,只有在组
'A'
中的每个值 'R'
都分配了一个标识符时才能完成此操作
- 测试于
python 3.10
、pandas 1.3.4
、matplotlib 3.5.0
import pandas as pd
import matplotlib.pyplot as plt
# sample dataframe
data = {'A': [208, 208, 208, 210, 213, 213, 213, 213, 213, 215, 222],
'R': [1, 5, 2, 9, 5, 8, 6, 3, 3, 6, 4]}
df = pd.DataFrame(data, index='A')
# create a new column adding a unique identifier
df = df.assign(cols=df.groupby(level='A').cumcount())
# display(df)
R cols
A
208 1 0
208 5 1
208 2 2
210 9 0
213 5 0
213 8 1
213 6 2
213 3 3
213 3 4
215 6 0
222 4 0
# pivot the dataframe into a wide form which easily plots
dfp = df.pivot(columns='cols', values='R')
# display(dfp)
cols 0 1 2 3 4
A
208 1.0 5.0 2.0 NaN NaN
210 9.0 NaN NaN NaN NaN
213 5.0 8.0 6.0 3.0 3.0
215 6.0 NaN NaN NaN NaN
222 4.0 NaN NaN NaN NaN
# plot
ax = dfp.plot.bar(stacked=True, legend=False, rot=0)
plt.show()
这个问题可能看起来很简单,但我在任何地方都没有见过这个问题,因为我是 python 的新手,所以我不知道如何解决这个问题。
我正在尝试根据此数据框绘制堆积条形图:
A R
208 1
208 5
208 2
210 9
213 5
213 8
213 6
213 3
213 3
215 6
222 4
我尝试使用以下代码:
df.set_index('A', inplace=True)
df['R'].plot.bar(legend=True, stacked=True)
这导致
但我希望 x 轴上的相同值像这样堆叠:
我该怎么做?
- 如果不将数据帧转换为宽格式就无法完成此操作,只有在组
'A'
中的每个值'R'
都分配了一个标识符时才能完成此操作 - 测试于
python 3.10
、pandas 1.3.4
、matplotlib 3.5.0
import pandas as pd
import matplotlib.pyplot as plt
# sample dataframe
data = {'A': [208, 208, 208, 210, 213, 213, 213, 213, 213, 215, 222],
'R': [1, 5, 2, 9, 5, 8, 6, 3, 3, 6, 4]}
df = pd.DataFrame(data, index='A')
# create a new column adding a unique identifier
df = df.assign(cols=df.groupby(level='A').cumcount())
# display(df)
R cols
A
208 1 0
208 5 1
208 2 2
210 9 0
213 5 0
213 8 1
213 6 2
213 3 3
213 3 4
215 6 0
222 4 0
# pivot the dataframe into a wide form which easily plots
dfp = df.pivot(columns='cols', values='R')
# display(dfp)
cols 0 1 2 3 4
A
208 1.0 5.0 2.0 NaN NaN
210 9.0 NaN NaN NaN NaN
213 5.0 8.0 6.0 3.0 3.0
215 6.0 NaN NaN NaN NaN
222 4.0 NaN NaN NaN NaN
# plot
ax = dfp.plot.bar(stacked=True, legend=False, rot=0)
plt.show()