Pandas保存为CSV时更改NaN值的格式

时间:2018-06-16 19:18:41

标签: python pandas csv nan

我正在使用df并使用numpy转换数据 - 包括将空白(或'')设置为NaN。但是当我把df写入csv时 - 输出包含字符串'nan'而不是NULL。

我环顾四周但找不到可行的解决方案。这是基本问题:

df
index x    y   z
0     1   NaN  2
1     NaN  3   4

CSV输出:

index x    y   z
0     1   nan  2
1     nan  3   4

我尝试了一些设置'nan'为NULL但csv输出结果为'blank'而不是NULL:

dfDemographics = dfDemographics.replace('nan', np.NaN)
dfDemographics.replace(r'\s+( +\.)|#', np.nan, regex=True).replace('', 
np.nan)
dfDemographics = dfDemographics.replace('nan', '')  # of course, this wouldn't work, but tried it anyway.

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:8)

拯救熊猫,使用na_rep来修复你自己的NaN表示。

df.to_csv('file.csv', na_rep='NULL')

file.csv

,index,x,y,z
0,0,1.0,NULL,2
1,1,NULL,3.0,4

答案 1 :(得分:0)

使用df.replace可能会有所帮助 -

{{1}}

(这会将所有空值设置为'',即空字符串。)

答案 2 :(得分:0)

用户@coldspeed说明了保存pd.DataFrame时如何用NULL替换nan值。如果要进行数据分析,有兴趣将pd.DataFrame中的“ NULL”值替换为np.NaN值,则可以执行以下代码:

import numpy as np, pandas as pd

# replace NULL values with np.nan
colNames = mydf.columns.tolist()
dfVals = mydf.values
matSyb = mydf.isnull().values
dfVals[matSyb] = np.NAN

mydf = pd.DataFrame(dfVals, columns=colNames)    
#np.nansum(mydf.values, axis=0 )
#np.nansum(dfVals, axis=0 )

答案 3 :(得分:0)

在我的情况下,罪魁祸首是np.where。当两个返回元素的数据类型不同时,您的np.NaN将转换为nan

(对我来说)很难确切了解底层情况,但是我怀疑这对于其他具有混合类型的Numpy数组方法可能是正确的。

一个最小的例子:

import numpy as np
import pandas as pd

seq = [1, 2, 3, 4, np.NaN]
same_type_seq = np.where("parrot"=="dead", 0, seq)
diff_type_seq = np.where("parrot"=="dead", "spam", seq)

pd.Series(seq).to_csv("vanilla_nan.csv", header=False) # as expected, last row is blank
pd.Series(same_type_seq).to_csv("samey_nan.csv", header=False) # also, blank
pd.Series(diff_type_seq).to_csv("nany_nan.csv", header=False) # nan instead of blank

那么如何解决这个问题?我不太确定,但是作为小型数据集的变通办法,您可以将原始序列中的NaN替换为令牌字符串,然后将其替换回np.NaN

repl = "missing"
hacky_seq = np.where("parrot"=="dead", "spam", [repl if np.isnan(x) else x for x in seq])
pd.Series(hacky_seq).replace({repl:np.NaN}).to_csv("hacky_nan.csv", header=False)