pd.to_csv
には、個々の列の形式を変更するパラメータがありませんが、pd.to_string
はあります。少し面倒で、非常に大きなDataFramesでは問題になるかもしれませんが、正しくフォーマットされた文字列を生成し、その文字列をファイルに書き込むことができます(これはanswer同様の質問です)。 to_string
のformatters
パラメータは、たとえば、個々の列をフォーマットする関数の辞書を取ります。あなたのケースでは、列の独自のカスタムフォーマッタを作成し、他の列の既定値を残すことができます。このフォーマッタは、多少のようになります。
def printInt(b):
if pd.isnull(b):
return "NaN"
else:
return "{:d}".format(int(b))
今、あなたはあなたの文字列を生成するためにこれを使用することができます:
与え
df.to_string(formatters={"b": printInt}, na_rep="NaN")
:あなたがまだあることがわかります
' a b\n0 1.25 1424380449437\n1 2.54 1425510731187\n2 NaN NaN'
これはカンマ区切りではなく、to_string
は実際にカスタムデリミタを設定するパラメータがありませんが、これは正規表現で簡単に修正できます:
import re
re.sub("[ \t]+(NaN)?", ",",
df.to_string(formatters={"b": printInt}, na_rep="NaN"))
ができます:
with open("/tmp/test.csv", "w") as f:
print(re.sub("[ \t]+(NaN)?", ",",
df.to_string(formatters={"b": printInt}, na_rep="NaN")),
file=f)
あなたが何を望むかになり:
,a,b
0,1.25,1424380449437
1,2.54,1425510731187
2,,
もし
',a,b\n0,1.25,1424380449437\n1,2.54,1425510731187\n2,,'
これは、現在のファイルに書き込むことができます、あなたのデータフレームの前に空白を含む文字列が含まれていると
,a,b
0,1.25,1424380449437
1,2.54,1425510731187
2,NaN,NaN
:
with open("/tmp/test.csv", "w") as f:
print(re.sub("[ \t]+", ",",
df.to_string(formatters={"b": printInt}, na_rep="NaN")),
file=f)
が得られます:あなたは、あなただけの正規表現を変更することができ、CSVファイルにNaN
年代を維持したいです堅牢なソリューションはそれほど簡単ではありません。次のエントリの開始を示す、すべての値の前に別の文字を挿入できます。すべての文字列に空白が1つしかない場合は、別の空白を使用することができます。これは、これにコードを変更します
与えるだろう
import pandas as pd
import numpy as np
import re
df = pd.DataFrame({'a a':[1.25, 2.54], 'b':[1424380449437, 1425510731187]})
df.loc[2] = np.NaN
def printInt(b):
if pd.isnull(b):
return " NaN"
else:
return " {:d}".format(int(b))
def printFloat(a):
if pd.isnull(a):
return " NaN"
else:
return " {}".format(a)
with open("/tmp/test.csv", "w") as f:
print(re.sub("[ \t][ \t]+", ",",
df.to_string(formatters={"a": printFloat, "b": printInt},
na_rep="NaN", col_space=2)),
file=f)
:
,a a,b
0,1.25,1424380449437
1,2.54,1425510731187
2,NaN,NaN
潜在的に 'nan'値をゼロに置き換えて、列をintergerに変換することができます。 'df.b = df.b.fillna(0).astype(int)'または '-1'を使って後で処理する際のエントリを識別します。 –
それは可能ですが、かなりぎこちない回避策です。簡単なインデックス作成とフィルタリングが可能なため、「ナノ」値をそのまま使用することをお勧めします。また、「ナノ」に使用するプレースホルダの値は、データフレーム内で自然に発生する可能性があります。 – Alarik