python - Pandas:帮助转换数据和编写更好的代码

标签 python pandas

我有两个数据源,我可以通过一个字段加入它们,并想在图表中汇总它们:

数据

两个 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,利用 clipnp.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())

enter image description here


也相当于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/

相关文章:

python - 当我从 api (yfinance) 获取数据时,Numpy 数组缺少日期

python - 在 Python 中生成数据透视表 - Pandas? NumPy ? Xlrd?来自 csv

python - pip安装pyaudio错误cl.exe失败

python - python Requests post数据为string类型时默认编码是什么?

python - Boost.Python 函数指针作为类构造函数参数

python strftime 不适用于小时分钟和秒

python - 使用 django 和 AngularJS 使用 JWT 登录所需的装饰器

python - 将 pandas DataFrame 索引转换为时间戳格式

python - df.groupby() 需要修改帮助

python - pandas.read_csv() 方法中的 `sep` 和 `delimiter` 属性有什么区别?