Pandasの基本的ですが、実際によく使いそうな使い方のメモです。
インストールについて
こちらが非常に詳しいです。 anacondaを使って環境構築します。
Google Compute Engine + Debian で実行しましたが、問題なく動いてます。
データサイエンティストを目指す人のpython環境構築 2016
csv形式のStringからデータを読み取る。
Stringから直接csvデータを読み込むこともできます。 http://stackoverflow.com/questions/22604566/how-to-create-a-pandas-dataframe-from-string
import sys
from io import StringIO
d = StringIO("""a,b,c
1,2,3
11,12,13
""")
df = pd.read_csv(d)
データフレームを連結する
Python Pandasでのデータ操作の初歩まとめ − 前半:データ作成&操作編 pandasでindexの連番を振り直す
concatもしくは、append関数を使います。
行を追加する場合も、DataFrameの連結で行います。
- concatは対象とするDataFrameをリストにして渡します。
- appendは
df.append
という書き方になるので、直接行を追加する場合に便利です。 - どちらもデフォルトでは、非破壊的な動作になっています。
行方向に追加
concatを使って連結
// axis=0 (デフォルト。省略可能)
concated_df = pd.concat([df1, df2])
ちなみに、カラム名が異なると、カラムは全て残り、互いの欠損箇所には、NA値が挿入されます。
欠損値を埋めたい場合は、fillna
を使います。統計処理で必要とされる、平均値補完、線形補間なども簡単にできます。
// 0埋め
df.fillna(0)
// 平均値
df.fillna(df.mean())
// 線形補間
df.interpolate()
// na値削除(行ベース)
df.dropna()
// na値削除(列ベース)
df.dropna(axis=1)
appendを使って行をその場で追加
// columnsを既存のものから取ってきて同じ構造にします
appended_df = df.appned(pd.DataFrame([[1,2,3]], columns = df.columns.tolist())
列方向に追加
pd.concat([df1, df2], axis=1)
同じくインデックスが違うと列方向にNA値が挿入される。
新しい列をその場で追加する方法は、こちらが簡単です。 ただ、dfを直接書き換えるので注意が必要です。
df['c_new'] = [1,2,3]
インデックス・カラムの貼り直し
行番号の貼り直し
concated_df.reset_index(drop=True)
//直接生成時に貼り直すこともできる
pd.concat([df1,df2]).reset_index(drop=True)
カラム名の貼り直し
// dfインスタンスに対して設定
concated_df.columns = ["c1","c2","c3","c4","c5","c6"]
表記ブレをなくすよう変更
// 全て小文字にして、スネークケースにする。記号も開きました。
df.columns = [s.lower().replace(' ', '_').replace('?', '_bool') for s in df.columns.tolist()]
SQLのような処理を行う
よくまとまっていてオススメです。
sort
sort_valuesを使う方が推奨のようです。
df.sort_values(by="col1")
ERROR
CSVのパースエラー
CSVを読み込む時に、パースエラーが発生しました。
> df = pd.read_csv("file.csv")
pandas/parser.pyx in pandas.parser.TextReader.read (pandas/parser.c:8748)()
pandas/parser.pyx in pandas.parser.TextReader._read_low_memory (pandas/parser.c:9003)()
pandas/parser.pyx in pandas.parser.TextReader._read_rows (pandas/parser.c:9731)()
pandas/parser.pyx in pandas.parser.TextReader._tokenize_rows (pandas/parser.c:9602)()
pandas/parser.pyx in pandas.parser.raise_parser_error (pandas/parser.c:23325)()
CParserError: Error tokenizing data. C error: EOF inside string starting at line 244276
ここで line 244276 は、ファイル上の行数でないので注意が必要です。
この時は結果的に、csvファイルの最終行のデータがおかしくなっていためエラーになっていました。
それでも解決しない場合は、この辺りが参考になると思います。
ISSUEが立っていますが、この問題は現在は、フィックスされてるよう。 https://github.com/pydata/pandas/issues/5501
カラムが多すぎるとExceptionを吐くが、それらを削除して読み込む。
pd.read_csv("file.csv", error_bad_lines=False)
エンコーディングとエンジンを指定する
pd.read_csv("file.csv", encoding='utf-8', engine='c')
pd.read_csv("file.csv", encoding='utf-8', engine='python')
quotingを指定する
import csv
pd.read_csv("file.csv", quoting=csv.QUOTE_NONE)
文字列として読み込んで解析する
f = open("file.csv")
s = f.read()
l = f.readlines()
0 件のコメント:
コメントを投稿