Applying Function to Multi Index Pandas DataFrame(函数在多索引 pandas 数据帧中的应用)
本文介绍了函数在多索引 pandas 数据帧中的应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我正在处理的DataFrame的示例:
import pandas as pd
import numpy as np
from scipy.stats import zscore
df = pd.DataFrame(
index=pd.MultiIndex.from_tuples(
[('Monday', '2019-11-04'),('Monday', '2019-11-11'), ('Monday', '2019-11-18'),
('Tuesday', '2019-11-05'), ('Tuesday', '2019-11-12'), ('Tuesday', '2019-11-19'),
('Wednesday', '2019-11-06'), ('Wednesday', '2019-11-13'), ('Wednesday', '2019-11-20'),
( 'Thursday', '2019-11-07'), ('Thursday', '2019-11-14'), ('Thursday', '2019-11-21'),
('Friday', '2019-11-01'), ('Friday', '2019-11-08'), ('Friday', '2019-11-15'),
('Saturday', '2019-11-02'), ('Saturday', '2019-11-09'), ('Saturday', '2019-11-16'),
('Sunday', '2019-11-03'), ('Sunday', '2019-11-10'), ('Sunday', '2019-11-17')]),
data={'A': [363287, 348759, 295711, 346276, 350785, 292794, 328048, 315418,
303901, 324330, 302850, 308500, 415665, 324196, 289739, 444184,
361214, 359573, 436543, 375668, 379184],
'B': [263641, 293827, 272811, 267064, 307886, 269061, 266336, 292442,
273714, 268377, 278113, 270378, 268556, 274989, 268869, 312046,
321059, 322694, 323546, 332234, 333341],
'C': [263678, 293870, 272855, 267092, 307931, 269114, 266378, 292488,
273769, 268426, 278156, 270422, 268602, 275021, 268906, 312084,
321116, 322741, 323602, 332298, 333405]})
现在,我正在通过使用for循环对每列应用scipy.stats.zscore
来获取每列中每个值的zcore:
for col in df.columns:
df[col] = zscore(df[col])
在应用zcore函数时,不考虑每列中的所有数字,而是如何在应用该函数之前按索引的第一级(星期几)进行分组?例如,我想首先对df.loc[('Monday'), 'A']
中的值应用该函数,然后对df.loc[('Tuesday'), 'A']
中的值应用该函数,依此类推。
还有,有没有一种方法可以不涉及将DataFrame的子集追加到列表中,然后在处理它们后将它们连接起来。
谢谢!
推荐答案
使用Groupby.transform
:
df.groupby(level=0)['A','B','C'].transform(zscore)
# A B C
#weekdays dates
#Monday 2019-11-04 0.942314 -1.038220 -1.038401
# 2019-11-11 0.442097 1.350720 1.350641
# 2019-11-18 -1.384411 -0.312500 -0.312240
#Tuesday 2019-11-05 0.619782 -0.759579 -0.760220
# 2019-11-12 0.790974 1.412882 1.412849
# 2019-11-19 -1.410756 -0.653303 -0.652628
#Wednesday 2019-11-06 1.243122 -1.015742 -1.016228
# 2019-11-13 -0.037621 1.360045 1.359854
# 2019-11-20 -1.205501 -0.344304 -0.343626
#Thursday 2019-11-07 1.367941 -0.931907 -0.931481
# 2019-11-14 -0.994700 1.387182 1.387292
# 2019-11-21 -0.373242 -0.455275 -0.455811
#Friday 2019-11-01 1.363756 -0.759293 -0.757889
# 2019-11-08 -0.357646 1.412897 1.412967
# 2019-11-15 -1.006110 -0.653604 -0.655078
#Saturday 2019-11-02 1.414010 -1.399768 -1.399981
# 2019-11-09 -0.686236 0.525278 0.526673
# 2019-11-16 -0.727775 0.874490 0.873309
#Sunday 2019-11-03 1.412341 -1.406665 -1.406678
# 2019-11-10 -0.769170 0.576959 0.577073
# 2019-11-17 -0.643171 0.829706 0.829605
此GROUP BY LEVEL=0索引(星期一,星期二...)
或者如果要重命名索引
df = df.rename_axis(index = ['weekdays','dates'])
df.groupby('weekdays').transform(zscore)
这篇关于函数在多索引 pandas 数据帧中的应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:函数在多索引 pandas 数据帧中的应用
猜你喜欢
- 将文件从Azure文件加载到Azure数据库 2022-09-21
- 基于多个一级列的子集多索引DataFrame 2022-09-22
- 如何命名HDF5数据集中的列? 2022-09-21
- 使用带有CROSS_VAL_SCORE的自定义估计器失败 2022-09-21
- 获取多索引中某个级别的最后一个元素 2022-09-22
- H5py:如何在HDF5组和数据集上使用key()循环 2022-09-21
- 如何防止Groupby超越指数? 2022-09-22
- 如何将属性添加到作为组存储在HDF5文件中的 pa 2022-09-21
- 合并具有多个索引和列值的数据帧 2022-09-22
- 为什么切换屏幕在Kivy中不起作用? 2022-09-21