我有一个数据框,我希望每一列都为字符串格式。所以我这样做:
df = df.astype(str)
问题在于,以这种方式,所有的NaN条目都被转换为字符串“ nan”。并且isnull
返回false
。有没有一种方法可以转换为字符串,但保持原样为空?
答案 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))