gpt4 book ai didi

python - 从离散化数值的 pandas get_dummies 创建开放边界指标

转载 作者:太空狗 更新时间:2023-10-30 01:28:08 25 4
gpt4 key购买 nike

从数字 age pandas 列,用 qcut 离散化为 ageD,我们从 qcut 边界创建开放边界:

import pandas as pd
from itertools import chain

d = {'age': {0: 5, 1: 23, 2: 43, 3: 70, 4: 30}}
df = pd.DataFrame.from_dict(d)
df['ageD'] = pd.qcut(df.iloc[:, 0], 2)
df.ageD.cat.categories
# Index([u'[5, 30]', u'(30, 70]'], dtype='object')

从 Index([u'[5, 30]', u'(30, 70]'], dtype='object') 我们制作 bopens:

>>> bopens = get_open_bounds(df)
>>> bopens
# ['(-inf, 5]', '(-inf, 30]', '(-inf, 70]', '(5, +inf)', '(30, +inf)', '(70, +inf)']

然后我们使用 get_dummies 将分类变量转换为虚拟/指标变量:

df = pd.get_dummies(df)
print df
# age ageD_[5, 30] ageD_(30, 70]
# 0 5 1 0
# 1 23 1 0
# 2 43 0 1
# 3 70 0 1
# 4 30 1 0

我想用开放边界列丰富数据框,df.shape 将是相当大,~(10e6, 32)。为每行制作 6 个 bopen cols 的最佳方法是什么?

目标 df 将如下所示:

>>> df
age age_[5, 30] age_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf)
0 5 1 0 1 1 1 0 0 0
1 23 1 0 0 1 1 1 0 0
2 43 0 1 0 0 1 1 1 0
3 70 0 1 0 0 1 1 1 0
4 30 1 0 0 1 1 1 0 0

PS:get_open_bounds 用于制作 bopens:

def get_open_bounds(df):
bounds = [(int(x[1:]), int(y[:-1])) for x, y in
[c.split(', ') for c in df.ageD.cat.categories]]
bounds = list(chain(*bounds))
bounds
# [5, 30, 30, 70]

# to get uniques, keeping the order
bounds = [b for idx, b in enumerate(bounds) if b not in bounds[:idx]]

# make the open bounds
bopens = ["(-inf, {}]".format(b) for b in bounds] + \
["({}, +inf)".format(b) for b in bounds]
return bopens

最佳答案

IIUC,你可以通过一些广播来做到这一点:

df['ageD'], bins = pd.qcut(df.iloc[:, 0], 2, retbins=True)
left = (df["age"].values <= bins[:,None]).T.astype(int)
dl = pd.DataFrame(left, columns=["(-inf, {}]".format(b) for b in bins])
dr = pd.DataFrame(1-left, columns=["({}, +inf)".format(b) for b in bins])
dout = pd.concat([pd.get_dummies(df), dl, dr], axis=1)

给我

>>> dout
age ageD_[5, 30] ageD_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf)
0 5 1 0 1 1 1 0 0 0
1 23 1 0 0 1 1 1 0 0
2 43 0 1 0 0 1 1 1 0
3 70 0 1 0 0 1 1 1 0
4 30 1 0 0 1 1 1 0 0

注意 #1:通过添加 retbins = True 我可以自己获取 bin 并避免一些笨拙的字符串解析。

注意 #2:通过隐含的“右 = 1 - 左”,我假设没有年龄是 NaN,因此 >= 或 < 之一必须为真;如果不确定,您可以改为 right = (df["age"].values > bins[:,None].T.astype(int)。)

注意 #3:实际上我也应该传递框架构造函数 df.index —— 虽然您的示例具有规范索引,但在您的实际数据中可能并非如此。

关于python - 从离散化数值的 pandas get_dummies 创建开放边界指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34529542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com