如何在忽略NaN的情况下将Pandas DataFrame中的所有列转换为“对象”?

时间:2018-10-09 19:33:09

标签: python pandas

我有一个数据框,我希望每一列都为字符串格式。所以我这样做:

 df = df.astype(str)

问题在于,以这种方式,所有的NaN条目都被转换为字符串“ nan”。并且isnull返回false。有没有一种方法可以转换为字符串,但保持原样为空?

3 个答案:

答案 0 :(得分:4)

将您的空值转换为空字符串,然后将数据帧转换为字符串类型。

df.replace(np.nan, '').astype(str)

请注意,您可以通过以下方式测试“空”:

df.apply(lambda s: s.str.len() == 0) 

答案 1 :(得分:4)

当您执行astype(str)时,dtype将始终为object,这是一个包含混合列的dtype。因此,您可以做的一件事就是像以前一样使用object将其转换为astype(str),然后将nan替换为实际的NaN(本质上是浮点数) ),允许您使用isnull之类的方法进行访问:

df.astype(str).replace('nan',np.nan)

示例:

df = pd.DataFrame({'col1':['x',2,np.nan,'z']})
>>> df
  col1
0    x
1    2
2  NaN
3    z

# Note the mixed str, int and null values:
>>> df.values
array([['x'],
       [2],
       [nan],
       ['z']], dtype=object)

df2 = df.astype(str).replace('nan',np.nan)

# Note that now you have only strings and null values:
>>> df2.values
array([['x'],
       ['2'],
       [nan],
       ['z']], dtype=object)

答案 2 :(得分:2)

对于系列,您只能在astype的零件上使用notnull,而无需重新放置NaN s

df = pd.DataFrame([1, np.nan, 'String'])
df[df.notnull()] = df[df.notnull()].astype(str)

如评论中所述,对于DataFrame,您可以使用

df.where(df.notnull(), df.astype(str))