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)
使用set_index和unstack:
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)
有四种惯用的pandas方法可以做到这一点。
pivotset_indexpivot_tablegroupbypivot
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)
定时
使用groupby、set_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