vin*_*mar 7 python transpose pivot dataframe pandas
df1 = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C']})
Run Code Online (Sandbox Code Playgroud)
| 富 | 酒吧 | |
|---|---|---|
| 0 | 一 | 一种 |
| 1 | 一 | 乙 |
| 2 | 一 | C |
| 3 | 二 | 一种 |
| 4 | 二 | 乙 |
| 5 | 二 | C |
我想将其转换为
| 富 | 值1 | 值2 | val3 |
|---|---|---|---|
| 一 | 一种 | 乙 | C |
| 二 | 一种 | 乙 | C |
我试过的代码是:
pd.pivot_table(df1,index='foo',aggfunc=['first'])
Run Code Online (Sandbox Code Playgroud)
但是上面的代码只返回第一个值
我们可以枚举组groupby cumcount并将它们用作枢轴列,然后add_prefix是数值并将reset_index'foo' 值返回到列:
new_df = (
df1.pivot_table(index='foo',
columns=df1.groupby('foo').cumcount() + 1,
values='bar',
aggfunc='first')
.add_prefix('val')
.reset_index()
)
Run Code Online (Sandbox Code Playgroud)
foo val1 val2 val3
0 one A B C
1 two A B C
Run Code Online (Sandbox Code Playgroud)
看看如何df1.groupby('foo').cumcount() + 1制作列:
foo columns
0 one 1 # First instance of "one"
1 one 2 # Second instance of "one"
2 one 3 # Third instance of "one"
3 two 1
4 two 2
5 two 3
Run Code Online (Sandbox Code Playgroud)
生成上述DataFrame的代码:
demo_df = pd.DataFrame({
'foo': df1['foo'],
'columns': df1.groupby('foo').cumcount() + 1
})
Run Code Online (Sandbox Code Playgroud)