Python 如何将Pandas DataFrame中的所有列转换为';对象';而忽视南?

Python 如何将Pandas DataFrame中的所有列转换为';对象';而忽视南?,python,pandas,Python,Pandas,我有一个数据帧,我希望每个列都是字符串格式。所以我这样做: df = df.astype(str) 问题是,通过这种方式,所有的NaN条目都被转换为字符串“NaN”。而isnull返回false。是否有一种方法可以转换为字符串,但保持空条目不变?将空值转换为空字符串,然后将数据帧转换为字符串类型 df.replace(np.nan, '').astype(str) 请注意,您可以通过以下方式测试“空值”: df.apply(lambda s: s.str.len() == 0) 执行a

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

 df = df.astype(str)

问题是,通过这种方式,所有的NaN条目都被转换为字符串“NaN”。而
isnull
返回
false
。是否有一种方法可以转换为字符串,但保持空条目不变?

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

df.replace(np.nan, '').astype(str)
请注意,您可以通过以下方式测试“空值”:

df.apply(lambda s: s.str.len() == 0) 
执行
astype(str)
操作时,数据类型始终是
对象
,这是一种包含混合列的数据类型。因此,您可以做的一件事是使用
astype(str)
将其转换为
object
,但随后将
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)

对于系列,您可以仅对
notnull
零件使用
astype
,而无需重新更换
NaN
s

df = pd.DataFrame([1, np.nan, 'String'])
df[df.notnull()] = df[df.notnull()].astype(str)
如注释中所述,对于数据帧,您可以使用

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

这只适用于一列,否则会出现
TypeError
。相反,您需要
df.where(~df.notnull(),df.astype('str'))
来概括它+谢谢你的好主意。谢谢你的回答。我认为这更符合我的目的。我在没有df.where的情况下尝试了它,效果很好。