gpt4 book ai didi

Python Pandas : Why is numpy so much faster than Pandas for column assignment? 我可以进一步优化吗?

转载 作者:太空狗 更新时间:2023-10-29 21:58:13 24 4
gpt4 key购买 nike

我主要使用 pd.get_dummies() 将分类变量转换为二进制矩阵,从而为机器学习分类任务预处理数据。这适用于单个 Pandas DataFrame 列,并输出一个新的 DataFrame,其行数与原始行数相同,并且原始列中的唯一分类变量数宽度相同。

我需要为形状为 (3,000,000 x 16) 的 DataFrame 完成此操作,它输出形状为二进制矩阵:(3,000,000 x 600)

在这个过程中,转换为二进制矩阵的步骤 pd.get_dummies() 非常快,但是使用 pd.DataFrame.loc 对输出矩阵进行赋值要慢得多[]。由于我已经切换到直接保存到 np.ndarray ,这很多 更快,我只是想知道为什么? (请查看问题底部的终端输出以进行时间比较)

n.b. 正如评论中所指出的,我可以在整个框架上只使用所有 pd.get_dummies()。然而,一些列需要定制的预处理,即:放入桶中。最难处理的列是包含一串标签(由,,分隔的列,必须这样处理:df[col]。 str.replace(' ','').str.get_dummies(sep=',')。此外,预处理的训练集和测试集需要相同的列集(继承自 all_cols),因为它们可能不需要一旦它们被分解成矩阵,就具有相同的特征。

请查看下面每个版本的代码

数据框版本:

def preprocess_df(df):
with open(PICKLE_PATH + 'cols.pkl', 'rb') as handle:
cols = pickle.load(handle)

x = np.zeros(shape=(len(df),len(cols)))
# x = pd.DataFrame(columns=all_cols)

for col in df.columns:
# 1. make binary matrix
df_col = pd.get_dummies(df[col], prefix=str(col))

print "Processed: ", col, datetime.datetime.now()

# 2. assign each value in binary matrix to col in output
for dummy_col in df_col.columns:
x.loc[:, dummy_col] = df_col[dummy_col]

print "Assigned: ", col, datetime.datetime.now()

return x.values

np版本:

def preprocess_np(df):
with open(PICKLE_PATH + 'cols.pkl', 'rb') as handle:
cols = pickle.load(handle)

x = np.zeros(shape=(len(df),len(cols)))

for col in df.columns:
# 1. make binary matrix
df_col = pd.get_dummies(df[col], prefix=str(col))

print "Processed: ", col, datetime.datetime.now()

# 2. assign each value in binary matrix to col in output
for dummy_col in df_col.columns:
idx = [i for i,j in enumerate(all_cols) if j == dummy_col][0]
x[:, idx] = df_col[dummy_col].values.T

print "Assigned: ", col, datetime.datetime.now()

return x

定时输出(10,000 示例)

数据框版本:

Processed:  Weekday 
Assigned: Weekday 0.437081
Processed: Hour 0.002366
Assigned: Hour 1.33815

np版本:

Processed:  Weekday   
Assigned: Weekday 0.006992
Processed: Hour 0.002632
Assigned: Hour 0.008989

是否有其他方法可以进一步优化它?我很感兴趣,因为目前我正在放弃一个可能有用的功能,因为它太慢了,无法处理额外的 15,000 列到输出。

对于我所采用的方法的任何一般性建议也非常感谢!

谢谢

最佳答案

一个实验是更改为 x.loc[:, dummy_col] = df_col[dummy_col].values。如果输入是一个序列,pandas 会检查每个分配的索引顺序。如果不需要,使用 ndarray 分配会关闭它,这应该会提高性能。

关于Python Pandas : Why is numpy so much faster than Pandas for column assignment? 我可以进一步优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36517352/

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