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

hi3rlvi2  于 2023-09-27  发布在  其他
关注(0)|答案(6)|浏览(142)

我正在使用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.

如果你能帮忙的话,我将不胜感激。

dsf9zpds

dsf9zpds1#

Pandas来拯救,使用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
f1tvaqid

f1tvaqid2#

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

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

(This将所有null值设置为'',即空字符串。

7vux5j2d

7vux5j2d3#

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

nwlls2ji4#

根据gherka和Kranthi Kiran的回答:

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

wj8zmpe15#

我想有人已经发布了这个,但你拒绝了它,因为在文件中显示'NULL'字符串:

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

现在我明白你想要一个实际的空白值。CSV是文本文件,空白文本只是空的stting '',所以解决方案是使用它:

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

这对我很有效。其他一些解决方案可能仍然有效,但这是迄今为止最简单和最直接的。如果这是一个固定宽度的文件,你必须用空格来替换这个字段的宽度,但是对于csv你不需要空格,只需要空字符串。
PS:我本来想对其他用户的回复发表评论,但我是新用户,因此还不允许发表评论。也就是说,任何支持都值得赞赏。

fgw7neuy

fgw7neuy6#

User @coldspeed演示了如何在保存pd. DataFrame时将nan值替换为NULL。在数据分析中,如果有兴趣将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 )

相关问题