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

Python 保存为CSV时更改NaN值的格式,python,pandas,csv,nan,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输出结果是“空白”而

我正在使用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输出结果是“空白”而不是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.

任何帮助都将不胜感激。

为了营救熊猫,请使用
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

使用df.replace可能有助于-

df = df.replace(np.nan, '', regex=True)
df.to_csv("df.csv", index=False)

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

User@coldspeed演示了如何在保存pd.DataFrame时将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 )

在我的情况下,罪魁祸首是
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)

这并不完全是我所需要的——它用一个“NULL”字符串替换df中的NA。我意识到我的帖子可能不清楚——我的意思是空——什么都不清楚。也就是说,csv输出中的NaN应该是零-没有字符串,没有数据,包括空格。@Jerry关于
df.to_csv('file.csv',na_rep='')
?@Jerry实际上这是
to_csv
的默认行为,你可能做错了其他事情,但我不知道如何从你发布的输入中获得输出@user2285236-我相信你是对的-这不应该发生;脚本中还发生了其他一些事情,很可能是我使用了numpy(np.select)。我会坚持下去。@Jerry“可能还有别的事情发生”,那可能是什么?你现在的问题无法回答。我们应该把它关上吗?谢谢-但这里也没有运气。可能正在发生其他事情。请详细说明您希望在end.csv文件中为Nan值设置什么,例如,您希望它们为null还是什么?我不能理解@csv输出中的Jerrynan应该是-什么都不是。出于某种原因,df中带有NaN的某些列被写入为“NaN”(作为字符串)或仅为“”(空字符串)。这个问题很可能是在数据转换过程中出现的,可能是由于我使用了np.select。非字符串的所有内容都强制转换为字符串,以避免数组中存在混合类型。