我有两个数据源,我可以通过一个字段加入它们,并想在图表中汇总它们:
数据
两个 DataFrame 共享 A
列:
ROWS = 1000
df = pd.DataFrame.from_dict({'A': np.arange(ROWS),
'B': np.random.randint(0, 60, size=ROWS),
'C': np.random.randint(0, 100, size=ROWS)})
df.head()
A B C
0 0 10 11
1 1 7 64
2 2 22 12
3 3 1 67
4 4 34 57
和我加入的其他
:
other = pd.DataFrame.from_dict({'A': np.arange(ROWS),
'D': np.random.choice(['One', 'Two'], ROWS)})
other.set_index('A', inplace=True)
df = df.join(other, on=['A'], rsuffix='_right')
df.head()
A B C D
0 0 10 11 One
1 1 7 64 Two
2 2 22 12 One
3 3 1 67 Two
4 4 34 57 One
问题
获取柱形图的正确方法:
- C 是 GTE50,D 是 One
- C 是 GTE50,D 是 Two
- C 是 LT50,D 是 One
- C 是 LT50,D 是二
按 B 分组,分为 0、1-10、11-20、21-30、21-40、41+。
最佳答案
IIUC,这可以大大简化为单个 groupby,利用 clip
和 np.ceil
来形成您的组。具有 2 个级别的单个 unstack 为我们提供了 B 分组作为我们的 x 轴,每个 D-C 组合都有条形图:
如果你想要更好的标签,你可以映射 groupby
值:
(df.groupby(['D',
df.C.ge(50).map({True: 'GE50', False: 'LT50'}),
np.ceil(df.B.clip(lower=0, upper=41)/10).map({0: '0', 1: '1-10', 2: '11-20', 3: '21-30', 4: '31-40', 5: '41+'})
])
.size().unstack([0,1]).plot.bar())
也相当于B组:
pd.cut(df['B'],
bins=[-np.inf, 1, 11, 21, 31, 41, np.inf],
right=False,
labels=['0', '1-10', '11-20', '21-30', '31-40', '41+'])
关于python - Pandas:帮助转换数据和编写更好的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956396/