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

Cat*_*331 4 python pandas

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

 df = df.astype(str)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*der 5

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

df.replace(np.nan, '').astype(str)
Run Code Online (Sandbox Code Playgroud)

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

df.apply(lambda s: s.str.len() == 0) 
Run Code Online (Sandbox Code Playgroud)


sac*_*cuL 5

当您这样做时astype(str),dtype将始终为object,这是一个包含混合列的dtype。因此,您可以做的一件事就是像往常一样将其转换为objectusing astype(str),然后将其替换为nan实际的NaN(本质上是一个float),从而允许您使用以下方法访问它isnull

df.astype(str).replace('nan',np.nan)
Run Code Online (Sandbox Code Playgroud)

例:

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)
Run Code Online (Sandbox Code Playgroud)


gof*_*onx 3

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

df = pd.DataFrame([1, np.nan, 'String'])
df[df.notnull()] = df[df.notnull()].astype(str)
Run Code Online (Sandbox Code Playgroud)

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

df.where(df.isna(), df.astype(str))
Run Code Online (Sandbox Code Playgroud)