今日もPandas!
NumpyとPandasで超AI入門でならった計算が
比較的簡単にできるということが分かった。
作った人すごい。
■AIを学ぶ為の本格Python講座
PY17_Pandas_データの選択
今日学んだこと
Pandasでのデータの取り扱い
データの取り出し方
Seriesの場合
>>> nenrei
futarou 40
satoshi 20
mitsuyo 50
youko 55
dtype: int64
>>>
nenreiの中にあるかどうかを判断
あればTrue
>>> 'futarou' in nenrei
True
>>>
なければFalse
>>> 'futarou999' in nenrei
False
>>>
各インデックスを表示
>>> nenrei.keys()
Index(['futarou', 'satoshi', 'mitsuyo', 'youko'], dtype='object')
>>>
インデックスと値をまとめた配列で取得
ループ処理等で使える。
>>> list(nenrei.items())
[('futarou', 40), ('satoshi', 20), ('mitsuyo', 50), ('youko', 55)]
>>>
値を追加できる。
>>> nenrei
futarou 40
satoshi 20
mitsuyo 50
youko 55
dtype: int64
>>>
>>> nenrei['takashi']=45
>>>
>>> nenrei
futarou 40
satoshi 20
mitsuyo 50
youko 55
takashi 45
dtype: int64
>>>
インデックスによるスライス
satoshiからyoukoを取得(youkoを含む)
>>> nenrei['satoshi':'youko']
satoshi 20
mitsuyo 50
youko 55
dtype: int64
自動的割当てのインデックスによるスライス(4は含まれない)
自動割当の場合は、4が含まれないので注意!
>>> nenrei[1:4]
satoshi 20
mitsuyo 50
youko 55
dtype: int64
>>>
条件を指定してマスクする
>>> nenrei[(nenrei>=50)&(nenrei<60)] mitsuyo 50 youko 55 dtype: int64 >>>
DataFrameの場合
>>> nenrei
futarou 40
satoshi 20
mitsuyo 50
youko 55
takashi 45
dtype: int64
>>>
>>> shinchou
futarou 190
satoshi 167
mitsuyo 155
youko 148
dtype: int64
>>> status=pd.DataFrame({
... 'nenrei':nenrei,
... 'shinchou':shinchou
... })
>>> status
nenrei shinchou
futarou 40 190
satoshi 20 167
mitsuyo 50 155
youko 55 148
>>>
インデックス
行
>>> status.index
Index(['futarou', 'satoshi', 'mitsuyo', 'youko'], dtype='object')
>>>
列
>>> status.columns
Index(['nenrei', 'shinchou'], dtype='object')
>>>
1列をseriesとして取得
>>> status['nenrei']
futarou 40
satoshi 20
mitsuyo 50
youko 55
Name: nenrei, dtype: int64
>>>
別の取り出し方
>>> status.nenrei
futarou 40
satoshi 20
mitsuyo 50
youko 55
Name: nenrei, dtype: int64
>>>
列の追加
>>> taijyu
futarou 100
satoshi 50
mitusyo 45
youko 58
mitsuyo 45
dtype: int64
>>>
配列のように追加できる。
>>> status['taijyu']=taijyu
>>>
>>> status
nenrei shinchou taijyu
futarou 40 190 100
satoshi 20 167 50
mitsuyo 50 155 45
youko 55 148 58
>>>
計算結果を列に追加もできる。
>>> status['BMI']=status['taijyu']/((status['shinchou']/100)**2)
>>>
>>> status
nenrei shinchou taijyu BMI
futarou 40 190 100 27.700831
satoshi 20 167 50 17.928215
mitsuyo 50 155 45 18.730489
youko 55 148 58 26.479182
結果をnumpy配列で取り出す
>>> status.values
array([[ 40. , 190. , 100. , 27.70083102],
[ 20. , 167. , 50. , 17.92821543],
[ 50. , 155. , 45. , 18.73048907],
[ 55. , 148. , 58. , 26.47918188]])
>>>
Numpy配列で0番目を取ると、行方向に取り出される。(Pandasと反対)
>>> status.values[0]
array([ 40. , 190. , 100. , 27.70083102])
>>>
DataFrameで名前を指定すると、列を取得できる
>>> status['nenrei']
futarou 40
satoshi 20
mitsuyo 50
youko 55
Name: nenrei, dtype: int64
>>>
ilocを使用するとnumpyスタイルで行列を取得できる。
>>> status
nenrei shinchou taijyu BMI
futarou 40 190 100 27.700831
satoshi 20 167 50 17.928215
mitsuyo 50 155 45 18.730489
youko 55 148 58 26.479182
>>>
行2つ分、列3つ分を取り出している。
>>> status.iloc[:2,:3]
nenrei shinchou taijyu
futarou 40 190 100
satoshi 20 167 50
>>>
locを使うとpd.DataFrameのインデックス形式で取得できる。
>>> status
nenrei shinchou taijyu BMI
futarou 40 190 100 27.700831
satoshi 20 167 50 17.928215
mitsuyo 50 155 45 18.730489
youko 55 148 58 26.479182
>>>
行はmitsuyoまで、列はnenreiまでを取得
>>> status.loc[:'mitsuyo',:'nenrei']
nenrei
futarou 40
satoshi 20
mitsuyo 50
>>>
条件でフィルタ
>>> status.loc[status['taijyu']>60]
nenrei shinchou taijyu BMI
futarou 40 190 100 27.700831
>>>
取り出したい列を指定できる。
>>> status.loc[status['taijyu']>60,['nenrei','shinchou']]
nenrei shinchou
futarou 40 190
>>>
値の書き換え
>>> status.iloc[1,1]
167
>>> status.iloc[1,1]=170
>>>
>>> status.iloc[1,1]
170
>>> status
nenrei shinchou taijyu BMI
futarou 40 190 100 27.700831
satoshi 20 170 50 17.928215
mitsuyo 50 155 45 18.730489
youko 55 148 58 26.479182
>>>
行列を入れ替えることができる(転置)
>>> status.T
futarou satoshi mitsuyo youko
nenrei 40.000000 20.000000 50.000000 55.000000
shinchou 190.000000 170.000000 155.000000 148.000000
taijyu 100.000000 50.000000 45.000000 58.000000
BMI 27.700831 17.928215 18.730489 26.479182
>>>
Pandasの計算
>>> data=pd.DataFrame(
... np.random.randint(0,10,(3,4)),
... columns=['A','B','C','D']
... )
>>>
>>> data
A B C D
0 2 9 3 2
1 7 4 3 2
2 8 7 6 2
>>>
numpy関数をそのまま適用できる。
Pandasの形式のまま結果が出る。
>>> np.exp(data)
A B C D
0 7.389056 8103.083928 20.085537 7.389056
1 1096.633158 54.598150 20.085537 7.389056
2 2980.957987 1096.633158 403.428793 7.389056
>
>>> np.sin(data*np.pi/4)
A B C D
0 1.000000e+00 7.071068e-01 0.707107 1.0
1 -7.071068e-01 1.224647e-16 0.707107 1.0
2 -2.449294e-16 -7.071068e-01 -1.000000 1.0
>>>>>
計算結果をそのまま列の追加に使える
>>> data['sinA']=np.sin(data['A'])
>>> data
A B C D sinA
0 2 9 3 2 0.909297
1 7 4 3 2 0.656987
2 8 7 6 2 0.989358
>>>
勉強時間
今日: 0.5時間
総勉強時間: 33.5時間
お得キャンペーンの紹介
ラビットチャレンジの
Amazonギフト券「5,000円」プレゼントキャンペーンのお知らせ
申込時に、以下コードを使えば、入会金が5000円引かれるようです。
また、紹介した僕にも5000円のAmazonギフト券が送られるようです。
お得なので、よかったら申込時お使いください。
紹介コード:friend0019697
※本キャンペーンの期間は、 2021年9月15日~10月31日 です。
「お友達紹介キャンペーン」特設ページ:
https://ai99