web-dev-qa-db-ja.com

Pandas CSVに保存するときのNaN値の形式の変更

私はdfで作業していて、numpyを使用してデータを変換しています-空白(または '')をNaNに設定することを含みます。しかし、dfをcsvに書き込むと、出力にはNULLとは反対の文字列「nan」が含まれます。

見回しましたが、実行可能な解決策が見つかりません。基本的な問題は次のとおりです。

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.

任意の助けいただければ幸いです。

10
Jerry

パンダを助けて、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
18
cs95

ユーザー@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 )
0
Good Will

私の状況では、犯人はnp.whereでした。 2つの戻り要素のデータ型が異なる場合、np.NaNnanに変換されます。

内部で何が行われているのかを正確に把握することは(私にとって)困難ですが、これは、型が混在する他の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)
0
gherka

Df.replaceを使用すると役立つ場合があります-

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

(これにより、すべてのnull値が ''つまり空の文字列に設定されます。)

0
Kranthi Kiran