我的问题是一种普遍的问题。我有一个数据框,在许多列中有许多空/空字符串,带有dtype对象。我应该原样离开还是将它们转换为np.nan。我通常做的是用np.nan替换那些空字符串。这是一个好习惯吗?谢谢你的建议。
答案 0 :(得分:0)
我也遇到过同样的问题。
dataFrame中的空单元不一定必须是none类型,实际上,大多数时候它可以是以下类型之一:str类型的“”,“”,“”,“”。这种情况尤其在您在dataFrames中执行并行语料库过滤或预处理任务时发生。无论如何,我在网络上发现了许多解决方案,其中一个解决方案是python的一个非常漂亮的功能,但不适用于dataFrames。但我会提一下。
由于空列表将返回False,例如:
if an_object == list
字符串也是如此:
if a_str_obj == str
但是,由于它不适用于dataFrame,因此,除非有循环选项,否则-我无法想象为什么有人会这样做而不是实现python的强大功能。
一种方法是,您可以使用使用lambda的字符串内置函数来创建函数。这是代码:
def is_empty(a_str):
if a_str.strip() == '':
return 1
else:
return 0
df["is_empty"] = df["str_field"].apply(lambda x: is_empty(x]))
关于为什么我不同意在dataFrames中使用foor循环而倾向于使用的说明
lambda,即使它不是最有效的方法:
我对长度= 100 dataFrame进行了时序测试。
计时结果如下:
使用lambda:
每个循环4.68 ms±79 µs(平均±标准偏差,共运行7次,每个循环100个)
使用循环
每次循环16.3 ms±38.8 µs(平均±标准偏差,共运行7次,每个循环100次)
或者,如果您关心效率,可以使用地图功能,该功能快得多。 在这里:
a = list(map(is_empty, df["str_field"].values))
c = list(map(bool, a))
df[c]["is_empty"] = 1
它产生:
每个回路889 µs±22.2 µs(平均±标准偏差,共运行7次,每个回路1000个)