LoginSignup
7
13

More than 3 years have passed since last update.

Pandasでデータ操作!

Last updated at Posted at 2019-11-07

はじめに

社内開発タスクでpandasを使う機会が何度かあったのですが、
そんなに頻繁でもないのであれどうやるんだっけとか、
そもそもどうやるんだっけとかが多いです。
また、性質上数GBのデータを扱う機会が多いので、
そういった場合にも対応できるような方法を随時更新していこうと思います。
そのため、構成としてはやりたいこと⇒やりかたといった形で記載します。

ちなみにゴリゴリ機械学習をやってるとかではないため、
その辺の話はでてきませんのでご了承ください。

csvの読み込み

そもそもcsvを読み込めないと何にもできません。
ので読み込み方から。
基本は以下で大丈夫。


df = pd.read_csv("ファイル名")

大容量ファイルの読み込み

ただ、ファイルサイズがGBの世界になってくると、
メモリに乗り切らないといった可能性が上がってきます。
そういった場合にはchunksizeオプションをつけて分割して読み込みしてあげましょう。

なお、chunksizeを指定した場合、
Dataframeではなく、TextFileReader インスタンスというもので読み込まれます。
TextFileReaderはループで回してあげれば、DataFrameを取り出すことが可能。
以下の例でいくと50行ずつ取り出してPrintされる。


data = pd.read_csv("test.csv", chunksize=50)
for i in data:
  print(i)
オプション
オプション名 意味
encoding 文字コードの指定 encoding='UTF-8'
skiprows 読み飛ばす行を指定 skiprows=2
chunksize 指定した行数毎に読み込み chunksize=50
usecols 指定した列のみ読み込み usecols=[1, 3]

その他オプション

2データの連結

別々のファイルをそれぞれ読み込んで連結する方法


# ファイル1読み込み
Data1 = pd.read_csv(file1, dtype = np.float32)
# ファイル2読み込み
Data2 = pd.read_csv(file2, dtype = np.float32)
# 2データを連結
rawData = pd.concat([Data1, Data2], ignore_index=True)

特定の列を取得する


df['A']

特定の区間の行を抽出する


df[1:3]

行は0から始まるので、この場合1行目は取得できないので注意。
また、:3は2までの意味合いです。

不要なカラムの削除

inplace=Trueの指定で元のdataframeが変更される。
以下の例ではDataからCity,Priceカラムがなくなる。


df.drop(columns=['City', 'Price'], axis = 1, inplace=True)

列番号で指定も可能


df.drop(columns=[[1, 2]], axis = 1, inplace=True)

行の削除


df.drop(df.index[[1, 3, 5]])

なお、デフォルトでは行のindexは0から連番になっているが、
sortなどをかけたあとだとindexが連番ではなくなるので注意。

特定カラムの置換


df.replace({列名: {元の値: 置換後の値}})

ある列の値でデータの分割

列の値で処理を変える場合に使う。
GroupBy オブジェクトを返してくれるため、そのままfor文でがちゃがちゃできる。


for カラムの値, データフレーム in df.groupby('カラム名'):
    各処理

なお、indexは飛び飛びになるので、
各データフレームでindexを貼り直す場合はreset_index()を使う。
※drop=True を指定しなければ、旧インデックスがデータ列に移動するので注意。

for city,sdf in  df.groupby('city'):
    sdf.reset_index(drop=True)
    if city = 'Tokyo':
             flags = 1

レコード数のカウント

1列目の配列の要素数を返却。
[0]なしだと行列をそれぞれカウント。


pd.shape[0]

平均


means = df.mean(axis = 0) 

標準偏差


std = df.std(axis = 0) 

csvの保存

dataframeの加工後csvとして保存する場合は以下。


df.to_csv("ファイル名")
オプション名 意味
columns 特定列のみ書き出し columns=['age']
header ヘッダーの有無 header=False
index インデックスの有無 index=False

pandasでcsvファイルの書き出し・追記(to_csv)

参考

PandasとNumPyの違いと使い分け方
カラムの値でDataFrameをグループ分割 - pandas
pandas.DataFrameの行・列を指定して削除するdrop
pandasでcsv/tsvファイル読み込み(read_csv, read_table)
DataFrame のインデックスを reset_index で振り直す-python

7
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
13