芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

pandas 私的メモ

簡単なpandasデータの作り方

>>> import pandas as pd
>>> twod_array = [[0,1,2],[3,4,5],[6,7,8]]
>>> data =pd.DataFrame(twod_array)
>>> data
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
>>> data[:]
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
>>> data[:][:]
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8

:で全要素を選択する

>>> data[3][:]
Traceback (most recent call last):
~~~
KeyError: 3

存在しない行(名)や列(名)の指定でKeyErrorが起きる.

データフレーム

  • pd.Series :1次元配列に対応した表形式データのオブジェクト
  • pd.DataFrame:2次元配列に対応した表形式データのオブジェクト←pd.Seriesの上位互換

基本的に使い方や使えるメソッドは同じ.ただし,扱える次元数に注意する.
value_counts()はpd.Seriesで使えるメソッド.pd.DataFramにはないので,pd.DataFramをスプライシングしてpd.Seriesにしたら使える.

スライシングの方法

>>> data[0]
0    0
1    3
2    6
Name: 0, dtype: int64
>>> data[0][1]
3
>>> data[0:2+1:2]
   0  1  2
0  0  1  2
2  6  7  8
>>> data[0:2+1:2][:]
   0  1  2
0  0  1  2
2  6  7  8
>>> data[:][0:2+1:2]
   0  1  2
0  0  1  2
2  6  7  8
>>> data[0][0:2+1:2]
0    0
2    6
Name: 0, dtype: int64

まとめ

# 列のスライス
data[start:end+1:stime][:]
# 行のスライス
data[:][start:end+1:stime]
  • start :開始
  • end :終了
  • stime:区切り間隔

いくつかのデータの統合

>>> no4ch = pd.DataFrame([0,1,2,3])
>>> no4ch
   0
0  0
1  1
2  2
3  3
>>> no6ch = pd.DataFrame([1,2,3,4])
>>> no6ch
   0
0  1
1  2
2  3
3  4
>>> con=pd.concat([no4ch, no6ch], axis=0)
>>> con
   0
0  0
1  1
2  2
3  3
0  1
1  2
2  3
3  4
>>> con=pd.concat([no4ch, no6ch], axis=1)
>>> con
   0  0
0  0  1
1  1  2
2  2  3
3  3  4
>>> type(con)
<class 'pandas.core.frame.DataFrame'>

pd.concatの第一引数につなげたいデータをリストで渡す.また,

  • axis=0:縦に並べてつなげる
  • axis=1:横に並べてつなげる

となる.行数が一致していない場合は,

FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

と警告が出るが,互いにない要素をNaNで埋めて結合してくれているので,特に問題はないかも.
また,con.fillna(0,inplace=True)とすると,NaNを全て0に置き換えるといった処理ができる.

csv出力

以前自身がやってたやり方

# 書き込むファイルのパスが”path”に代入されているという前提のもとのスクリプト
import csv

data = list(data)

with open(path,mode='w') as f:
    writer=csv.writer(f, lineterminator='\n') # writerオブジェクトを作成
    try:
        writer.writerow(data) # 内容を書き込む
    except UnicodeEncodeError as ue:
        message(ue,'csvファイルの書き込みに失敗しました')

pandasでのやり方

# 書き込むファイルのパスが”path”に代入されているという前提のもとのスクリプト
data.to_csv(path)

その他引数を指定できる.

列数が一定でないcsvの読み込み

列(カラム)数が一定でないcsvファイルをpandasで読み込もうとすると,pandas.errors.ParserErrorというエラーが出る.なので,

# 読み込むファイルのパスが”csv”に代入されているという前提のもとのスクリプト

def csv_column_name(csv):
    column_cnt = 0
    with open(csv,mode='r',encoding='utf-8') as f:
        for line in f:
            cnt = len(line.split(','))
            if column_cnt < cnt:
                column_cnt = cnt
    return [x for x in range(column_cnt)]

data = pd.read_csv(csv, engine='python',encoding='utf-8',header=None,names=csv_column_name(csv))

として,カラム名を作成して指定するとよい.

参考