fillna 表示字符串到 " ",对于数字到 -1 表示将表作为 JSON 传递


import numpy as np
import pandas as pd
df_margin=pd.DataFrame({"item":["a","b","c",np.nan],"margin":[3,4,5,np.nan]})

给定上面代码的下表,我想填充字符串为"&";,对于数字为-1,如何自动假设我有很多列?

item  margin
0    a     3.0
1    b     4.0
2    c     5.0
3  NaN     NaN

df_margin=pd.DataFrame({"item":["a","b","c","],"margin":[3,4,5,-1]}(期望结果

item  margin
0    a       3
1    b       4
2    c       5
3           -1

原因是我想把表作为json传递,但它不支持nan值,也欢迎更好的方法。

字符串的

df_margin[df_margin.select_dtypes('object').columns] = df_margin.select_dtypes('object').fillna(' ')

对于数字

df_margin[df_margin.select_dtypes('number').columns] = df_margin.select_dtypes('number').fillna(-1)

通过select_dtypes过滤数据帧,然后用所需值过滤NaN(include=None, exclude=None)

item  margin
0    a     3.0
1    b     4.0
2    c     5.0
3         -1.0
输出:
>>> df_margin.apply(lambda x: x.fillna(-1) if x.dtype.kind in 'biufcSUV' else x.fillna(''))
item  margin
0    a     3.0
1    b     4.0
2    c     5.0
3         -1.0

注意:

  1. 您可以进一步探索dtype.kind的不同值
  2. 我建议使用映射字典(object_type/fill_value(。如果你想有更多的细粒度控制

您可以尝试使用apply'biufcSUV'方法来获得您想要的结果。

方法一:

dtype.kind
A character code (one of ‘biufcOSUV’) identifying the general kind of data.
b   boolean
i   signed integer
u   unsigned integer
f   floating-point
c   complex floating-point
O   object
S   (byte-)string
U   Unicode
V   void

注意:要了解有关dtype.kind的更多信息,请阅读CCD_8

文档说明:

df_margin.fillna({'item':'', 'margin':'-1'})
# df_margin.fillna({'item':'', 'margin':'-1'}, inplace=True)
item margin
0    a      3
1    b      4
2    c      5
3          -1

方法二:

这种方法我觉得更优雅。

df_margin['item'] = df_margin.select_dtypes("object").fillna("")
df_margin['margin'] = df_margin.select_dtypes("float64").fillna("-1")
df_margin
item margin
0    a      3
1    b      4
2    c      5
3          -1

方法三:

df_margin.fillna(df_margin.dtypes.replace({'float64': -1, 'object': ''}))
item  margin
0    a     3.0
1    b     4.0
2    c     5.0
3         -1.0

PD_13