python - 是否有可行的方法在 PANDAS 中为 200 多个类别实施 expand_grid()?
问题描述
以下来自网络的用于实现函数 expand_grid() 的示例包含三个变量:身高(2 个类别)、体重(3 个类别)、性别(2 个类别),总共 2 * 3 * 2 = 12 个类别。
df={'height': [60, 70],
'weight': [100, 140, 180],
'sex': ['Male', 'Female']}
在上述对象上运行 expand_grid
expand_grid(df)
产生以下结果:
sex weight height
0 Male 100 60
1 Male 100 70
2 Male 140 60
3 Male 140 70
4 Male 180 60
5 Male 180 70
6 Female 100 60
7 Female 100 70
8 Female 140 60
9 Female 140 70
10 Female 180 60
11 Female 180 70
我想对具有以下列(类别)的数据集执行相同的操作:
种族 (9)、Marital_Status (3)、性别 (2)、年龄 (2)、西班牙裔 (2)。
那是 9*3*2*2*2 = 216 个类别。
我想要以下内容:
Race Marital_Status Sex Age Hispanic
0 White Married Male Under_18 Hispanic
1 White Married Male Under_18 Non-Hispanic
2 White Married Male Over_18 Hispanic
3 White Married Male Over_18 Non-Hispanic
4 White Married Male Over_18 Hispanic
5 White Married Female Under_18 Hispanic
.
.
.
216 Asian Single Female Over_18 Non-Hispanic
当我尝试运行 expand_grid() 时,系统内存不足。
有人告诉我,如果有一种方法可以让 Python 事先识别数据类型(例如列表、向量等),那将会更快且计算成本更低。有没有可行的方法来实现这一点?
非常感谢!
解决方案
PSL itertools包可以完成这项工作。
import itertools
import pandas as pd
cat = {
'C1': ['A', 'B', 'C'],
'C2': ['A', 'B'],
'C3': ['A', 'B', 'C', 'D']
}
order = cat.keys()
pd.DataFrame(itertools.product(*[cat[k] for k in order]), columns=order)
它创建了一个包含所有可能的类别模式组合(笛卡尔积)的 DataFrame:
C1 C2 C3
0 A A A
1 A A B
2 A A C
[...]
22 C B C
23 C B D
推荐阅读
- sql - 组合查询,其中一个是递归的
- r - 在 tidyverse 的 styler 包中,style_text 首次运行时提示用户输入
- google-sheets - 基于列的自动填充数字
- sql - 以开玩笑的方式并行运行创建扩展的 sql 迁移会触发约束错误
- javascript - 如果包含 html 输入的 Div 被隐藏,则删除必需的属性
- docker - 让 `pipenv run` 运行多个命令
- html - 如果键盘显示,全屏背景自动调整大小
- python - 如何在 SymPy 中获取表达式的系数列表?
- gitlab-ci - 为什么 Gitlab CI docker build 标记问题
- python - SQLAlchemy 删除对象列表(与 bulk_save_objects 相对)