Python PivotTable / Groupby文本列

时间:2017-08-18 18:43:28

标签: python pandas dataframe pivot-table

我正在努力拓宽我的python视野并学会做一些在Excel中执行相当简单的事情。

我有这些数据:

Group   Function
1   A
1   B
1   C
2   A
2   C
3   C
3   A
3   D
4   E

我想要一个表格,以这种格式显示信息(使用Excel中的数据透视表,使用列:功能,行:组,值:组计数)

      Function
Group A        B       C    D    E
1     1        1       1    
2     1                1
3     1                1    1
4                                1

我已经创建了一个数据框并添加了一个列,如下所示:

df = pd.read_excel(filepath)
df['1']=1

print(df.groupby('GROUP'))

但:

1)它没有识别Function字段,因为它是dtype:object 2)它并没有真正实现我正在寻找的功能,这让我觉得它可能不是我需要的功能。我也尝试过各种各样的pivot_table迭代,但似乎无法让它继续工作。

有没有人有任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:3)

pd.crosstab怎么样?按原样读入数据,然后转换:

In [227]: pd.crosstab(df.Group, df.Function)
Out[227]: 
Function  A  B  C  D  E
Group                  
1         1  1  1  0  0
2         1  0  1  0  0
3         1  0  1  1  0
4         0  0  0  0  1

使用df.replace删除零:

In [228]: pd.crosstab(df.Group, df.Function).replace(0, '')
Out[228]: 
Function  A  B  C  D  E
Group                  
1         1  1  1      
2         1     1      
3         1     1  1   
4                     1

答案 1 :(得分:2)

或使用pivot

df1['val']=1
df1.pivot(index='Group', columns='Function')['val']

Function    A    B    C    D    E
Group                            
1         1.0  1.0  1.0  NaN  NaN
2         1.0  NaN  1.0  NaN  NaN
3         1.0  NaN  1.0  1.0  NaN
4         NaN  NaN  NaN  NaN  1.0


df1.pivot(index='Group', columns='Function')['val'].fillna(' ')

Function  A  B  C  D  E
Group                  
1         1  1  1      
2         1     1      
3         1     1  1   
4                     1

或使用groupby

df1.groupby(['Group','Function']).size().unstack().fillna(' ')
Function  A  B  C  D  E
Group                  
1         1  1  1      
2         1     1      
3         1     1  1   
4                     1

答案 2 :(得分:2)

选项1

pd.get_dummies(df.Group).T.dot(pd.get_dummies(df.Function))

   A  B  C  D  E
1  1  1  1  0  0
2  1  0  1  0  0
3  1  0  1  1  0
4  0  0  0  0  1

选项2

i, r = pd.factorize(df.Group.values)
j, c = pd.factorize(df.Function.values)
a = np.zeros((r.size, c.size), dtype=int)
a[i, j] = 1
pd.DataFrame(a, r, c)

   A  B  C  D  E
1  1  1  1  0  0
2  1  0  1  0  0
3  1  0  1  1  0
4  0  0  0  0  1

选择3

i, r = pd.factorize(df.Group.values)
j, c = pd.factorize(df.Function.values)
a = np.bincount(
    i * c.size + j, minlength=r.size * c.size
).reshape(r.size, c.size)
pd.DataFrame(a, r, c)

   A  B  C  D  E
1  1  1  1  0  0
2  1  0  1  0  0
3  1  0  1  1  0
4  0  0  0  0  1