【问题标题】:Python PivotTable/Groupby Text ColumnsPython 数据透视表/Groupby 文本列
【发布时间】:2017-08-18 18:43:28
【问题描述】:

我正在尝试拓宽我的 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 进行各种迭代,但似乎无法使其正常工作。

有人有什么想法吗?提前致谢。

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢!这是一个不错的选择!
    【解决方案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
    

    【讨论】:

    • @Tony,美好的一天
    • Pivot 很好,但交叉表更短 imo :p。不过,干得好!
    • @cᴏʟᴅsᴘᴇᴇᴅ 同意~,当计算 size() 交叉表更好
    【解决方案3】:

    选项 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
    

    【讨论】:

    • pd.factorize... 我希望您的回答中会出现常见的嫌疑人。不错。
    • 非常感谢!
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2018-06-27
    • 2016-09-11
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多