如何在忽略 NaN 的情况下将 Pandas 数据帧中的所有列转换为 'object'?



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

df = df.astype(str)

问题是通过这种方式,所有 NaN 条目都转换为字符串 'nan'。isnull返回false.有没有办法转换为字符串但保持空条目不变?

当你做astype(str)时,dtype总是object的,这是一个包含混合列的dtype。因此,您可以做的一件事是使用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)

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

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

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

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

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

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

如注释中所述,对于数据帧,您可以使用

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

最新更新