Panda?
なんですかそれは……
説明をみるとどうやらRみたいな感じと考えればいいのかなーと思いつつ開始。
#準備
恒例のimport
Seriesは配列のようなオブジェクトなんですって……(?)
from pandas import Series,DataFrame
import pandas as pd
#Series
sample_pd_data=pd.Series([0,1,2,3,4,5,6,7,8,9])
print(sample_pd_data)
出力
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int64
2列表示……?要素のデータ型も表示してくれるのね。
#データの値
print(sample_pd_data.value)
#index
print(sample_pd_data.index)
出力
データの値: [0 1 2 3 4 5 6 7 8 9]
インデックスの値: RangeIndex(start=0, stop=10, step=1)
seriesそのものとvalueとでは異なるものなんですね。
sample_pd_index_data=pd.Series([0,1,2,3,4,5,6,7,8,9],index=['a','b','c','d','e','f','g','h','i','j'])
print(sample_pd_index_data)
出力
a 0
b 1
c 2
d 3
e 4
f 5
g 6
h 7
i 8
j 9
dtype: int64
あーなるほど。
2列だと思ったの、左側はindexだったんですね。
こうするとindexも任意にできる……と。
indexが足りなかったりするとエラーになるから注意。
#DataFrame
各列で異なる型を持てるらしい。
attri_data1={'ID':['100','101','102','103','104'],
'citi':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'birth_year':[1990,1989,1992,1997,1982],
'name':['Hiroshi','Akiko','Yuki','Satoru','Steeve']}
attri_data_frame1=DataFrame(attri_data1)
print(attri_data_frame1)
出力
attri_data1={'ID':['100','101','102','103','104'],
'city':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'birth_year':[1990,1989,1992,1997,1982],
'name':['Hiroshi','Akiko','Yuki','Satoru','Steeve']}
#DataFrame
attri_data_frame1=DataFrame(attri_fata1)
print(attri_data_frame1)
よくわからないけどDataFrame()にcbindみを感じる……。 うーん、自信ないから言及すんのやめとくわ……。
Series同様、indexを更新してみましょう
attri_data_frame_index1=DataFrame(attri_data1,index=['a','b','c','d','e',])
print(attri_data_frame_index1)
出力
ID birth_year city name
a 100 1990 Tokyo Hiroshi
b 101 1989 Osaka Akiko
c 102 1992 Kyoto Yuki
d 103 1997 Hokkaidao Satoru
e 104 1982 Tokyo Steeve
#転置
行列ではおなじみの操作が手軽にできるらしい
attri_data_frame1.T
できれいな表が出力できる。
#列指定
列指定にはデータの後にカラム名(?)をつける
#複数指定はリスト
attri_data_frame1[['ID','birth_year']]
出力
ID birth_year
0 100 1990
1 101 1989
2 102 1992
3 103 1997
4 104 1982
条件指定も
attri_data_frame1[attri_data_frame1['city']=='Tokyo']
#複数の条件指定(.isin())
attri_data_frame1[attri_data_frame1['city'].isin(['Tokyo','Osaka'])]
やってみた
``` attri_data_frame1[attri_data_frame1['birth_year']<=1990] ``` 出力 ``` ID birth_year city name 0 100 1990 Tokyo Hiroshi 1 101 1989 Osaka Akiko 4 104 1982 Tokyo Steeve ```#削除
#.drop([],axis=)で削除
#axis=1で列削除
attri_data_frame1.drop(['birth_year'],axis=1)
#axis=0で行削除
attri_data_frame1.drop([0],axis=0)
#結合&集計
#とりあえず2個目のdataframeは作ったとする
#pd.merge()で結合
pd.merge(attri_data_frame1,attri_data_frame2)
#groupby(A)[B]でAを軸にBを集計
attri_data_frame2.groupby("sex")["math"].mean
mean()の部分を変えれば種々の基本統計量も出せる
attri_data_frame2.groupby("sex")["math"].min()
attri_data_frame2.groupby("sex")["math"].max()
attri_data_frame2.groupby("sex")["math"].median()
#ソート
#.sort_index()でindexによる昇順ソート
#.sort_values()で値による昇順ソート
(ascending=False)で降順ソートだ!!
#その他
#.isin([])で存在確認
True or False で返事
#dataframe.(列名)=np.nan
列をnullにしちゃう
#.isnull()でその判別したり
こっちもTrue or False で返事
#.isnull().sum()でnullの数を数える……
…………なぜ?
#練習問題
問題1
``` from pandas import Series,DataFrame import pandas as pd attri_data1 = {'ID':['1','2','3','4','5'] ,'sex':['F','F','M','M','F'] ,'Money':[1000,2000,500,300,700] ,'name':['Saito','Horie','Kondo','Kawada','Matsubara']} attri_data_frame1 = DataFrame(attri_data1) attri_data_frame1[attri_data_frame1['Money']>=500] ```問題2
``` ※meanに()を忘れない attri_data_frame1.groupby('sex')['Money'].mean() ```問題3
``` attri_data2 = {'ID':['3','4','7'] ,'Math':[60,30,40] ,'English':[80,20,30]} attri_data_frame2 = DataFrame(attri_data2) pd.merge(attri_data_frame1,attri_data_frame2,on='ID',how='outer') on=''で列名指定 how=''で結合の仕方を指定します how:2つのdataframeについては inner:両方に存在するデータのみ残す left:1←2,1のデータはみんな残る right:1→2,2のデータはみんな残る outer:1+2,両方みんな残す。たぶんindexで並ぶ ```これ単体でつかうものではないでしょうから変なこといいますけど、これだけだとあんまりどう使うかわかんないよね。でもソートとか条件指定とかgroupbyとかけっこうイイカンジだよね。
あとSeriesはexcelの縦列みたいなものだと思っとこう。
一応、ちょこちょこ変えてるんですけど、やっぱ怖みなので今後は徐々に写経は減らします……。