我正在使用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.
任何帮助都将不胜感激。
答案 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)