我有一个数据框,我从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))
答案 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