我有一个pandas.DataFrame,它不会像我期望的那样转动.虽然pivot_table妥善安排了一切,但它使用聚合函数来实现这一目标的事实令人反感.此外,pivot_table似乎返回一个不必要的复杂对象而不是平面数据框.
请考虑以下示例
import pandas as pd
df = pd.DataFrame({'firstname':['Jon']*3+['Amy']*2,
'lastname':['Cho']*3+['Frond']*2,
'vehicle':['bike', 'car', 'plane','bike','plane'],
'weight':[81.003]*3+[65.6886]*2,
'speed':[29.022, 95.1144, 302.952, 27.101, 344.2],})
df.set_index(['firstname','lastname','weight'])
print('------ Unnecessary pivot_table does averaging ------')
print(pd.pivot_table(df, values='speed',
rows='firstname','lastname','weight'],
cols='vehicle'))
print('------ pivot method dies ------')
print(df.pivot( index=['firstname','lastname','weight'],
columns='vehicle',
values='speed'))
Run Code Online (Sandbox Code Playgroud)
该pivot_table结果
vehicle bike car plane
firstname lastname weight
Amy Frond 65.6886 27.101 NaN 344.200
Jon Cho 81.0030 29.022 95.1144 302.952
Run Code Online (Sandbox Code Playgroud)
有没有办法pivot提供与pivot_table命令基本相同的输出(但希望更平坦和更整洁)?如果做不到这一点,我该如何压扁输出pivot_table?我想要的输出是更像这样的东西:
firstname lastname weight bike car plane
Amy Frond 65.6886 27.101 NaN 344.200
Jon Cho 81.0030 29.022 95.1144 302.952
Run Code Online (Sandbox Code Playgroud)
如果你不想聚合pivot_table,你确实需要这个pivot功能.但是,pivot不提供多个索引列(实际上我不知道为什么).但是,有一个类似于pivot的功能unstack,它的工作方式相同,但是基于(多)索引而不是列.
因此,要使用此功能,您可以先将结果中的索引/列标签设置为索引:
df2 = df.set_index(['firstname','lastname','weight', 'vehicle'])
Run Code Online (Sandbox Code Playgroud)
然后在最后一级(默认)取消堆叠,依此类推'车辆'(成为列标签):
In [3]: df2.unstack()
Out[3]:
speed
vehicle bike car plane
firstname lastname weight
Amy Frond 65.6886 27.101 NaN 344.200
Jon Cho 81.0030 29.022 95.1144 302.952
Run Code Online (Sandbox Code Playgroud)
如果你不想要多索引,你可以用'展平'结果reset_index.
您唯一可能遇到的问题是列也有两个级别,因此您可以先删除第一级,然后重置索引以成为一个非常扁平的数据帧:
In [17]: df3 = df2.unstack()
In [18]: df3.columns = df3.columns.droplevel(0)
In [19]: df3.reset_index()
Out[19]:
vehicle firstname lastname weight bike car plane
0 Amy Frond 65.6886 27.101 NaN 344.200
1 Jon Cho 81.0030 29.022 95.1144 302.952
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4465 次 |
| 最近记录: |