首页 > 解决方案 > 是否有可行的方法在 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 事先识别数据类型(例如列表、向量等),那将会更快且计算成本更低。有没有可行的方法来实现这一点?

非常感谢!

标签: pythonpandascategoriescartesian-product

解决方案


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

推荐阅读