python - 如何在 pivot_table 聚合后映射熊猫结果?
问题描述
我有一些像这样通过的测试数据:
import numpy as np
import pandas as pd
data = [[np.random.choice(['Tmax', 'Tmin']), np.random.choice(['USA', 'FRA', 'AUS']),
np.random.randint(1,4), np.random.choice(['Class A', 'Class B']),np.random.randint(4)] for i in range(1000)]
df = pd.DataFrame(data, columns=['temp', 'region', 'method', 'slice', 'pass'])
我使用np.mean
以下函数对数据框进行了旋转:
pv = pd.pivot_table(df,
index=['temp', 'method'],
values=['pass'],
columns=['slice', 'region'],
aggfunc=(np.mean))
变量的值'pass'
是以小数形式(如 0.45、1.5 3.2...)通过测试的平均值,但是我想用以下函数映射这些结果
def results_mapper(v):
num_tests = np.round(v)
if num_tests < 2:
return 1
elif num_tests == 2:
return 2
else:
return 3
我尝试使用pv.map(results_mapper)
, 或map(results_mapper, pv)
但没有运气来映射结果。
样本编号:
输出pv
编号可能类似于0.5, 1.1, 1.49, 1.6, 1.9, 2.1, 2.9, 3.5
将映射到1, 1, 1, 2, 2, 2, 3, 3
如何通过保持数据透视表格式原样将映射函数应用于我的结果?
解决方案
利用np.vectorize
func = np.vectorize(results_mapper)
pv.values[:,:] = func(pv.values)
输出
pass
slice Class A Class B
region AUS FRA USA AUS FRA USA
temp method
Tmax 1 1.0 1.0 2.0 2.0 2.0 1.0
2 1.0 2.0 1.0 1.0 1.0 1.0
3 1.0 2.0 2.0 2.0 2.0 2.0
Tmin 1 2.0 1.0 2.0 2.0 1.0 2.0
2 2.0 2.0 1.0 2.0 1.0 2.0
3 2.0 1.0 1.0 2.0 2.0 1.0
推荐阅读
- kubernetes - 如何在 GKE 中正确执行 cron 任务
- nginx - 如何在 Nginx 反向代理后面集成 Minio 并与 JavaScript API 交互?
- python - Python Telegram 机器人获得所有工作和他们的名字?
- c# - 将 MenuItems 添加到控制台应用程序中 TrayIcon 的上下文菜单
- c# - restsharp 响应不包含任何内容
- haskell - 在使用使用记录语法定义的构造函数时如何定义 Applicative 和 Monad 的实例
- swift - 如何为 Publisher 编写自定义运算符?
- mysql - 如何在 laravel 中制作像下面这样的连接表
- linux - mailutils mailx 为附件设置“Content-Disposition:附件”
- java - 如何将 Java 可执行文件转换为 APK 以在 Android 上运行?