熊猫数据框转换

时间:2018-10-30 15:52:02

标签: python pandas pandas-groupby

考虑如下数据框:

             A        B        C
0   2018-10-13      100       50
1   2018-10-13      200       25
2   2018-10-13      300       10
3   2018-10-13      400        5
4   2018-10-13      500        0
5   2018-10-14      100      100
6   2018-10-14      200       50
7   2018-10-14      300       25
8   2018-10-14      400       10
9   2018-10-14      500        5
10  2018-10-15      100      150
11  2018-10-15      200      100
12  2018-10-15      300       50
13  2018-10-15      400       25
14  2018-10-15      500       10

我要执行的转换是:

  1. GroupB列A
  2. 然后将B列分组为3个间隔([0,100]说 intval-1 ,[101,200]说 intval-2 ,[201,end]说 intval-3 ]。可以概括为n个间隔。
  3. 在C列上执行汇总汇总

所以我的变换/透视数据框应该像

             A  intval-1  intval-2  intval-3
0   2018-10-13        50        25        15
1   2018-10-14       100        50        40
2   2018-10-13       150       100        85

实现此目标的简单方法将大有帮助。

谢谢。

2 个答案:

答案 0 :(得分:3)

您可以先cut,然后再pivot_table

bin_lst = [0, 100, 200, np.inf]

cut_b = pd.cut(df['B'], bins=bin_lst,
               labels=[f'intval-{i}' for i in range(1, len(bin_lst))])

res = df.assign(B=cut_b)\
        .pivot_table(index='A', columns='B', values='C', aggfunc='sum')

print(res)

B           intval-1  intval-2  intval-3
A                                       
2018-10-13        50        25        15
2018-10-14       100        50        40
2018-10-15       150       100        85

答案 1 :(得分:3)

pd.cutgroupby + unstack一起使用

df.B=pd.cut(df.B,bins=[0,100,200,np.inf],labels=['intval-1','intval-2','intval-3'])
df.groupby(['A','B']).C.sum().unstack()
Out[35]: 
B           intval-1  intval-2  intval-3
A                                       
2018-10-13        50        25        15
2018-10-14       100        50        40
2018-10-15       150       100        85