Pandas根据数据类型替换NaN

5
在DataFrane.to_csv中,我成功地写入了csv文件,并移除了nan值。
df = df.replace('None','')
df = df.replace('nan','')

但我的问题是,使用此方法会将所有NaN值替换为引号:''

是否可以根据类型替换NaN值?

if the nan dataframe == int dont add qoutes
if str set to ''
if float set to 0.0

我尝试了这段代码,但失败了。

df['myStringColumn'].replace('None', '')

编辑:这是我拥有的样本数据框

      aTest    Vendor     name     price    qty
 0    y        NewVend             21.20    nan
 1    y        OldMakes            11.20    3
 2    nan      nan        sample   9.20     1
 3    n        nan        make     nan      0

这里是我的目标。
'y','NewVend','',21.20,,     
'y','OldMakes','',11.20,3,
'','','sample',9.20,1,
'n','','make',0.0,0,

以下是完整脚本:

dtype_dic= {'price': float, 'qty': float}
df = pd.read_excel(os.path.join(sys.path[0], d.get('csv')), dtype=str)
for col, col_type in dtype_dic.items():
    df[col] = df[col].astype(col_type)
df = df.replace('None','')
df = df.replace('nan','')
df.to_csv('test.csv', index=False, header=False, quotechar='"', quoting=csv.QUOTE_NONNUMERIC)

4
任何包含字符串“None”或“nan”的序列必须为“object”类型,因为没有其他类型支持字符串。因此,很难确定每个序列的类型。 - jpp
1
不要使用类型,可以使用列来处理替换函数。df.column1.str.replace('None','') - mad_
@mad_ 收到了“to_replace”类型无效的错误:'str'。 - Led
谢谢您的回复,我已经更新了问题。 - Led
它确实执行了,但所有东西都变成了 '',甚至是整数和浮点数。 - Led
显示剩余2条评论
2个回答

14
您可以使用select_dtypes选择所需类型的列,然后使用fillna填充np.nan的NAN值,对于None也适用。
float_cols = df.select_dtypes(include=['float64']).columns
str_cols = df.select_dtypes(include=['object']).columns

df.loc[:, float_cols] = df.loc[:, float_cols].fillna(0)
df.loc[:, str_cols] = df.loc[:, str_cols].fillna('')

你获得

    aTest   Vendor      name    price   qty
0   y       NewVend             21.2    0.0
1   y       OldMakes            11.2    3.0
2                       sample  9.2     1.0
3   n                   make    0.0     0.0

1
尝试一下!
data = pd.read_csv("dataset/pokemon.csv")
data.head(7)


#   Name    Type 1  Type 2  HP  Attack  Defense Sp. Atk Sp. Def Speed   Generation  Legendary
0   1   Bulbasaur   Grass   Poison  45  49  49  65  65  45  1   False
1   2   Ivysaur Grass   Poison  60  62  63  80  80  60  1   False
2   3   Venusaur    Grass   Poison  80  82  83  100 100 80  1   False
3   4   Mega Venusaur   Grass   Poison  80  100 123 122 120 80  1   False
4   5   Charmander  Fire    NaN 39  52  43  60  50  65  1   False
5   6   Charmeleon  Fire    NaN 58  64  58  80  65  80  1   False
6   7   Charizard   Fire    Flying  78  84  78  109 85  100 1   False

了解字符串类型的列:
types = list(data.iloc[0])

str_types=[]
i=0
for a in l1:
    if type(a) == str:
        str_types.append(i)
    i+=1 

print str_types 
[1, 2, 3] #columns with string values

将 NaN 替换为 " ":
for a in str_types:
    data.iloc[:,a].fillna(" ",inplace =True)

data


#   Name    Type 1  Type 2  HP  Attack  Defense Sp. Atk Sp. Def Speed   Generation  Legendary
0   1   Bulbasaur   Grass   Poison  45  49  49  65  65  45  1   False
1   2   Ivysaur Grass   Poison  60  62  63  80  80  60  1   False
2   3   Venusaur    Grass   Poison  80  82  83  100 100 80  1   False
3   4   Mega Venusaur   Grass   Poison  80  100 123 122 120 80  1   False
4   5   Charmander  Fire        39  52  43  60  50  65  1   False
5   6   Charmeleon  Fire        58  64  58  80  65  80  1   False
6   7   Charizard   Fire    Flying  78  84  78  109 85  100 1   False
7   8   Mega Charizard X    Fire    Dragon  78  130 111 130 85  100 1   False
8   9   Mega Charizard Y    Fire    Flying  78  104 78  159 115 100 1   False
9   10  Squirtle    Water       44  48  65  50  64  43  1   False
10  11  Wartortle   Water       59  63  80  65  80  58  1   False

我测试了你的代码,它可以运行,但是我选择了Vaishali的答案,因为他/她回答得更快。我对Pokemon的参考笑了 :) - Led

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接