将pandas DataFrame转换为正确的格式:`DataError:没有要聚合的数字类型

Sha*_*ang 3 python pivot dataframe pandas

这是我想操作的pandas DataFrame:

import pandas as pd

data = {"grouping": ["item1", "item1", "item1", "item2", "item2", "item2", "item2", ...],
        "labels": ["A", "B", "C", "A", "B", "C", "D", ...],
        "count": [5, 1, 8, 3, 731, 189, 9, ...]}

df = pd.DataFrame(data)

print(df)
>>>   grouping            labels       count
0        item1             A            5
1        item1             B            1
2        item1             C            8
3        item2             A            3
4        item2             B          731
5        item2             C          189
6        item2             D            9
7        ...               ...         ....
Run Code Online (Sandbox Code Playgroud)

我想将此数据框"展开"为以下格式:

grouping    A    B    C    D
item1       5    1    8    3
item2       3    731  189  9
....        ........
Run Code Online (Sandbox Code Playgroud)

怎么会这样做?我认为这会奏效:

pd.pivot_table(df,index=["grouping", "labels"]
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

DataError: No numeric types to aggregate
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 6

使用set_indexunstack:

df = df.set_index(['grouping','labels']).unstack().rename_axis(None)
df.columns = df.columns.droplevel()
print(df)
Run Code Online (Sandbox Code Playgroud)

输出:

labels  A    B    C     D
item1   5    1    8  None
item2   3  731  189     9
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

有四种惯用的pandas方法可以做到这一点。

  • 分组列之间没有重复项。不需要聚合
    • pivot
    • set_index
  • 分组列之间重复。是否需要聚合
    • pivot_table
    • groupby

pivot

df.pivot('grouping', 'labels', 'count')
Run Code Online (Sandbox Code Playgroud)

set_index

df.set_index(['grouping', 'labels'])['count'].unstack()
Run Code Online (Sandbox Code Playgroud)

pivot_table

df.pivot_table('count', 'grouping', 'labels')
Run Code Online (Sandbox Code Playgroud)

groupby

df.groupby(['grouping', 'labels'])['count'].sum().unstack()
Run Code Online (Sandbox Code Playgroud)

全部产量

labels      A      B      C    D
grouping                        
item1     5.0    1.0    8.0  NaN
item2     3.0  731.0  189.0  9.0
Run Code Online (Sandbox Code Playgroud)

定时

在此输入图像描述

使用groupbyset_index、 或pivot_table方法,您可以轻松地用以下方法填充缺失值fill_value=0

df.pivot_table('count', 'grouping', 'labels', fill_value=0)

df.groupby(['grouping', 'labels'])['count'].sum().unstack(fill_value=0)

df.set_index(['grouping', 'labels'])['count'].sum().unstack(fill_value=0)
Run Code Online (Sandbox Code Playgroud)

全部产量

labels    A    B    C  D
grouping                
item1     5    1    8  0
item2     3  731  189  9
Run Code Online (Sandbox Code Playgroud)

额外的想法groupby

因为我们不需要任何聚合。如果我们想使用groupby,我们可以通过利用影响较小的聚合器来最小化隐式聚合的影响。

df.groupby(['grouping', 'labels'])['count'].max().unstack()
Run Code Online (Sandbox Code Playgroud)

或者

df.groupby(['grouping', 'labels'])['count'].first().unstack()
Run Code Online (Sandbox Code Playgroud)

定时groupby

在此输入图像描述

  • 因为“pivot”不会聚合或尝试聚合。 (2认同)