背景
書いてて辛くなったのでSQLと同じように出来ることとpandasだからできることの2段階に分けている
前回記事はこちら
https://qiita.com/open_cans/items/c1568eaf497bd82cdf29
pandasだからできること
色々方法はあると思うがapply関数を紹介後,DataFrame型から二次元配列への変換を紹介する。
apply関数(引数がリストじゃない)
applyで列に対して引数を一つとる関数を適用することができる。
例えばfloatの値をintに変換するint()関数がある。これを以下のcsv_dataのb列に適用すると
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
csv_data['b'] = csv_data['b'].apply(int)
↓csv_data
a | b | string |
---|---|---|
1 | 2.0 | ホゲ |
4 | 5.1 | ヒゲ |
↓適用後 |
a | b | string |
---|---|---|
1 | 2 | ホゲ |
4 | 5 | ヒゲ |
自作の関数を適用する例も載せておく |
import pandas as pd
def hoge(data):
data += 10
return data
csv_data = pd.read_csv("csv_data.csv")
csv_data['b'] = csv_data['b'].apply(hoge)
↓csv_data
a | b | string |
---|---|---|
1 | 2.0 | ホゲ |
4 | 5.1 | ヒゲ |
↓適用後 |
a | b | string |
---|---|---|
1 | 12.0 | ホゲ |
4 | 15.1 | ヒゲ |
apply関数(引数がリスト)
applyは複数列のデータを引数にとる関数を適用することもできる。
csv_dataのa列とb列の和が5よりも上なら1,それ以外は0を返す関数を適用する例を示す。
axis=1
を追加するといい。
追加すると、適用する関数にデータフレームの各行の列の値がリストで与えられる
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
def hoge(data1):
if data1[0]+data1[1] > 5:
return 1
return 0
sample1['c']=sample1[['a','b']].apply(hoge, axis=1)
↓csv_data
a | b | string |
---|---|---|
1 | 2.0 | ホゲ |
4 | 5.1 | ヒゲ |
↓適用後 |
a | b | string | c |
---|---|---|---|
1 | 2.0 | ホゲ | 0 |
4 | 5.1 | ヒゲ | 1 |
##DataFrameをリストに変換する
applyだけではやりたいことが実現できない!!ということもあるだろう
ということで2次元配列に変換してピュアなpythonで弄ってしまおうというお話
これらを適用すると(あなたがpythonで出来ることなら)なんでも出来るようになる
###1次元DataFrameをリストに変換する
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
csv_data = pd.DataFrame(csv_data['a']) #i次元のDataFrame
list_data = list(csv_data.values.flatten())
↓csv_data
a | b | string |
---|---|---|
1 | 2.0 | ホゲ |
4 | 5.1 | ヒゲ |
↓適用後 |
list_data
>> [1,4]
###2次元DataFrameをリストに変換する
import pandas as pd
csv_data = pd.read_csv("csv_data.csv")
list_data= [list(row) for _, row in csv_data.iterrows()]
↓csv_data
a | b | string |
---|---|---|
1 | 2.0 | ホゲ |
4 | 5.1 | ヒゲ |
↓適用後 |
list_data
>> [[1, 2.0, 'ホゲ'], [4, 5.1, 'ヒゲ']]