熊猫:帮助转换数据并编写更好的代码

Leo*_*lán 3 python pandas

我有两个数据源,可以按一个字段加入这些数据源,并希望在图表中进行汇总:

数据

两个DataFrames共享列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()
Run Code Online (Sandbox Code Playgroud)
   A   B   C
0  0  10  11
1  1   7  64
2  2  22  12
3  3   1  67
4  4  34  57
Run Code Online (Sandbox Code Playgroud)

other我这样加入:

   A   B   C
0  0  10  11
1  1   7  64
2  2  22  12
3  3   1  67
4  4  34  57
Run Code Online (Sandbox Code Playgroud)
   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
Run Code Online (Sandbox Code Playgroud)

获取具有以下计数的柱形图的正确方法:

  • C是GTE50,D是1
  • C是GTE50,D是2
  • C是LT50,D是1
  • C是LT50,D是2

按B分组,分为0、1-10、11-20、21-30、21-40、41 +。

ALo*_*llz 6

IIUC,这可以极大地简化为单个groupby,利用clipnp.ceil形成您的组。具有2个级别的单个拆栈将B组作为x轴,其中每个DC组合都带有条形:

如果您想要更好的标签,可以映射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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


它也等效于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+'])
Run Code Online (Sandbox Code Playgroud)