【问题标题】:Pandas Changing the format of NaN values when saving to CSVPandas 保存为 CSV 时更改 NaN 值的格式
【发布时间】:2018-11-26 05:00:52
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas csv nan


    【解决方案1】:

    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
    

    【讨论】:

    • 不完全是我需要的 - 这将 df 中的 NA 替换为字符串“NULL”。我意识到我的帖子可能不清楚 - 我的意思是 NULL - 什么都没有。那是 csv 输出中的 NaN,应该什么都不是 - 没有字符串,没有数据,包括空格。
    • @Jerry df.to_csv('file.csv', na_rep='') 怎么样?
    • @Jerry 实际上,这是to_csv 的默认行为,您可能做错了其他事情,但我看不出如何从您发布的输入中获取输出。 imgur.com/3xNP5aG
    • @user2285236 - 我相信你是对的 - 这不应该发生;脚本中发生了其他事情,很可能是我使用了 numpy (np.select)。会坚持下去的。
    • @Jerry “可能正在发生其他事情”,那可能是什么?你的问题目前是无法回答的。我们应该关闭它吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢 - 但这里也没有运气。可能还有其他事情发生。
    • 您能否详细说明您想要在最后的 .csv 文件中获取 Nan 值的内容,例如您希望它们为 null 还是什么?我无法理解。 @杰里
    • csv 输出中的 NaN 应该就是这样 - 什么都没有。出于某种原因,df 中带有 NaN 的某些列被写为“nan”(作为字符串)或只是“”(空字符串)。这个问题很可能是在数据转换过程中出现的,可能是我使用了 np.select。
    【解决方案3】:

    用户@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 )
    

    【讨论】:

      【解决方案4】:

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

      那么如何解决这个问题?我不太确定,但作为小型数据集的一种 hacky 解决方法,您可以将原始序列中的 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)
      

      【讨论】:

      • 所有不是字符串的东西都被强制转换为字符串以避免数组中的混合类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多