python中分组数据帧的转换

2024-04-24 08:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的数据帧

bin=[0,5,10]

code sex age
a     1   1
a     1   6
b     1   8
b     2   2
c     2   3
c     1   4 

我总结了一下

 df.groupby([df.code,df.sex,pd.cut(df.age,bin)]).size().unstack().stack().fillna(0)

我得到的结果如下

code sex    age
a    1  (0,5] 1
a    1 (5,10] 1
a    2  (0,5] 0
a    2 (5,10] 0
b    1  (0,5] 0
b    1 (5,10] 1
b    2  (0,5] 1
b    2 (5,10] 0
c    1  (0,5] 1
c    1 (5,10] 0
c    2  (0,5] 1
c    2 (5,10] 0

我想把这个df转换成

        1     2
        a b c  a b c
 (0,5]  1 0 1  0 1 1
(5,10]  1 0 0  0 0 0

我尝试了stack()或unstack(),但我完全搞不清楚如何转换到上面的数据帧。 我怎样才能改变他们? 有人告诉我如何像这样转换df。你知道吗


Tags: 数据dfagesizebinstackcodepd
3条回答

您可以用一个^{}来实现这一点:

In [11]: df
Out[11]:
  code  sex  age
0    a    1    1
1    a    1    6
2    b    1    8
3    b    2    2
4    c    2    3
5    c    1    4

In [12]: df.pivot_table(index=pd.cut(df.age, bins),
                        columns=["sex", "code"],
                        aggfunc="count",
                        fill_value=0)
Out[12]:
        age
sex       1        2
code      a  b  c  a  b  c
age
(0, 5]    1  0  1  0  1  1
(5, 10]   1  1  0  0  0  0

在您给定的数据帧上,执行以下操作:

df.set_index(['code','sex']).unstack(['code','sex'])

今后,请以允许其他人自己运行的形式提供数据,例如df.to_records()df.to_json()的输出。你知道吗

df.reset_index().set_index(['sex','code','age']).unstack(-1).T
Out[760]: 
sex           1        2      
code          a  b  c  a  b  c
      age                     
value (0,5]   1  0  1  0  1  1
      (5,10]  1  1  0  0  0  0

数据输入:

Out[762]: 
                 value
code sex age          
a    1   (0,5]       1
         (5,10]      1
     2   (0,5]       0
         (5,10]      0
b    1   (0,5]       0
         (5,10]      1
     2   (0,5]       1
         (5,10]      0
c    1   (0,5]       1
         (5,10]      0
     2   (0,5]       1
         (5,10]      0

crosstab

pd.crosstab(index=pd.cut(df.age, bin),
                        columns=[df.sex, df.code])
Out[768]: 
sex      1        2   
code     a  b  c  b  c
age                   
(0, 5]   1  0  1  1  1
(5, 10]  1  1  0  0  0

相关问题 更多 >