pandas fillna超级慢,get_dummies需要吗?

时间:2018-04-09 02:51:08

标签: python pandas nan

我有一个数据框,我从csv加载,其中许多值是整数,但许多条目也只是空白。当我这样打pd.get_dummies(frame)时:

binary_frame = pd.get_dummies(frame, )

结果框架未更改,换句话说,get_dummies似乎失败。因此,我使用fillna填写框架,如下所示:

frame = pd.read_csv(file_path, encoding="utf8")
frame.fillna(value="n/a", inplace=True)

然而,这花费了相当长的时间,并且在任何非平凡的行数(> = 10000)上,我的处理器被挂起并且我的机器没有响应,直到我终止该过程。

我的问题是,当框架中有空条目时,get_dummies的最佳和最快的方法是什么?我应该在原始帧上呼叫fillna还是有更好的方法?

更新:可以使用此复制编码失败。将其放在test.csv

a,b,c
1,,
,-1,
2,1,
1,1,1

然后运行

import pandas as pd
df = pd.read_csv("test.csv")
binary_df = pd.get_dummies(df)
print(binary_df.head(5))

看到框架没有变化。现在试试这个:

import pandas as pd
df = pd.read_csv("test.csv")
df.fillna("n/a", inplace=True)
binary_df = pd.get_dummies(df)
print(binary_df.head(5))

1 个答案:

答案 0 :(得分:0)

要使get_dummies生效,DataFrame的所有列都必须是分类变量(例如字符串)。如果列不是分类,则忽略它。

因此,处理数据的一种方法是将DataFrame转换为字符串:

pd.get_dummies(df.astype(str))
#   a_1.0  a_2.0  a_nan  b_-1.0  b_1.0  b_nan  c_1.0  c_nan
#0      1      0      0       0      0      1      0      1
#1      0      0      1       1      0      0      0      1
#2      0      1      0       0      1      0      0      1
#3      1      0      0       0      1      0      1      0

或者,请在阅读CSV文件时考虑关闭na_filter选项。你首先不会有NaN:

df = pd.read_csv("test.csv", na_filter=False)
pd.get_dummies(df)
   a_  a_1  a_2  b_  b_-1  b_1  c_  c_1
0   0    1    0   1     0    0   1    0
1   1    0    0   0     1    0   1    0
2   0    0    1   0     0    1   1    0
3   0    1    0   0     0    1   0    1