私は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.
任意の助けいただければ幸いです。
パンダを助けて、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
ユーザー@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 )
私の状況では、犯人はnp.where
でした。 2つの戻り要素のデータ型が異なる場合、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)
Df.replaceを使用すると役立つ場合があります-
df = df.replace(np.nan, '', regex=True)
df.to_csv("df.csv", index=False)
(これにより、すべてのnull値が ''つまり空の文字列に設定されます。)