Dav*_*ino 23 python pivot dataframe pandas data-cleaning
在Python中,我有一个类似于以下的pandas DataFrame:
Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45 | 50 | 53 | Clothes
TV | 200 | 300 | 250 | Technology
Book | 20 | 17 | 21 | Books
phone| 300 | 350 | 400 | Technology
Run Code Online (Sandbox Code Playgroud)
shop1,shop2和shop3是不同商店中每件商品的成本.现在,我需要在一些数据清理后返回一个DataFrame,如下所示:
Category (index)| size| sum| mean | std
----------------------------------------
Run Code Online (Sandbox Code Playgroud)
其中size是每个Category中的项目数和sum,mean和std与应用于3个商店的相同功能相关.如何使用split-apply-combine模式(groupby,aggregate,apply,...)执行这些操作?
有人可以帮我吗?我对这个疯狂了......谢谢!
piR*_*red 18
编辑Pandas 0.22+考虑通过聚合弃用组中的词典.
我们建立了一个非常相似的字典,我们使用字典的键来指定我们的函数,使用字典本身来重命名列.
rnm_cols = dict(size='Size', sum='Sum', mean='Mean', std='Std')
df.set_index(['Category', 'Item']).stack().groupby('Category') \
.agg(rnm_cols.keys()).rename(columns=rnm_cols)
Size Sum Mean Std
Category
Books 3 58 19.333333 2.081666
Clothes 3 148 49.333333 4.041452
Technology 6 1800 300.000000 70.710678
Run Code Online (Sandbox Code Playgroud)
选项1
使用agg←链接到文档
agg_funcs = dict(Size='size', Sum='sum', Mean='mean', Std='std')
df.set_index(['Category', 'Item']).stack().groupby(level=0).agg(agg_funcs)
Std Sum Mean Size
Category
Books 2.081666 58 19.333333 3
Clothes 4.041452 148 49.333333 3
Technology 70.710678 1800 300.000000 6
Run Code Online (Sandbox Code Playgroud)
选项2
更多用于较少
使用describe←链接到文档
df.set_index(['Category', 'Item']).stack().groupby(level=0).describe().unstack()
count mean std min 25% 50% 75% max
Category
Books 3.0 19.333333 2.081666 17.0 18.5 20.0 20.5 21.0
Clothes 3.0 49.333333 4.041452 45.0 47.5 50.0 51.5 53.0
Technology 6.0 300.000000 70.710678 200.0 262.5 300.0 337.5 400.0
Run Code Online (Sandbox Code Playgroud)
Sco*_*ton 10
df.groupby('Category').agg({'Item':'size','shop1':['sum','mean','std'],'shop2':['sum','mean','std'],'shop3':['sum','mean','std']})
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在所有商店中使用它,那么:
df1 = df.set_index(['Item','Category']).stack().reset_index().rename(columns={'level_2':'Shops',0:'costs'})
df1.groupby('Category').agg({'Item':'size','costs':['sum','mean','std']})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51648 次 |
| 最近记录: |