出力時の整形 - pandas

df.to_csv()などで出力する時、ちょっとした変換方法

UnixTimeをDateStringに変換

1514777696 → 2018/01/01 12:34:56 にする。int ⇒ numpy.datetime64 ⇒ str と変換する

# 目的: df['unix'] のUnixTimeを変換して df['datetime'] に格納する

# df['unix'] をdatetime64型に変換、時差9時間を足し日本時刻とする
df['datetime'] = pd.to_datetime(df['unix'], unit='s') + pd.Timedelta(9, unit='h')

# フォーマット
df['datetime'] = df['datetime'].dt.strftime('%Y/%m/%d %H:%M:%S')

NaNを含むintカラム

np.nanはint型で表現できないため、それを1つでも含むカラムは自動的にfloat型になる。float型は出力時の記述に「1.0」のように小数点が付いてしまう。

   code                   code
1  1.0       →        1  1
2  1.0   整数にしたい  2  1
3  nan                 3
4  3.0                 4  3
...                    ...

文字列に変換する

メモリや処理速度は多少効率悪くてもいい場合、文字列に変換するのがよい。

df['col'] = df['col'].dropna().apply(lambda x: str(int(x)))

nanを示す整数値を定義

妥協として、'-1'など、nanであることを示す値を定義して、その値で代替する。

df['col'] = df['col'].fillna(-1).astype(int)

カラムの選択・並べ替え

# 元のカラムの並び順
print(df.columns.tolist())
# ['a', 'b', 'c', 'd']

cols = ['a', 'c', 'b']
# この順で新しいdfを作る

df = df[cols]

整列

これは別に出力時に限った話でも無いけど。

# 'col'カラムでソート
df.sort_values('col', inplace=True)

# 'primary' => 'secondary' の優先順位でソート
df.sort_values(['primary', 'secondary'], inplace=True)

インデックスを振り直す

インデックス(行ID)を、今の並び順で0からの連番にする。

#     col1 col2
#  2     1    2
# 18    30    5
#  3    40    8

df.reset_index(drop=True, inplace=True)

#     col1 col2
#  0     1    2
#  1    30    5
#  2    40    8

カラム毎に小数点以下を揃える

df.round()を使う。{'カラム名': 小数点以下桁数} の辞書を渡すと、カラム毎にその桁数に揃える。

ただし桁数に0を指定してもint型にはならず、「1.0」のようなfloat型のままとなる。int型への変換はastype()を用いる。

#      col1          col2
#  0   3.141592653   3.141592653
#  1   2.718281828   2.718281828
#  2   1.414213562   1.414213562

df = df.round({'col1': 2, 'col2': 5})

#      col1   col2
#  0   3.14   3.14159
#  1   2.72   2.71828
#  2   1.41   1.41421

programming/python/packages/pandas/format_output.txt · 最終更新: 2018/10/24 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0