#1 この記事は
DataFrame型データの各種操作方法をメモする。
題名 | リンク |
---|---|
【python】Pandasの使い方 | LINK |
【python】Pandas2の使い方 | LINK |
【python】Pandas3の使い方 | LINK |
【python】Pandas4の使い方 | LINK |
【python】Pandas5の使い方 | LINK |
【python】Pandas ,pythonコードメモ 6 | LINK |
#2 内容
2-1 Multi Index型 DataFrameのデータについて特定のindexのみのデータを表示する。
sample.py
import pandas as pd
import numpy as np
idx = pd.IndexSlice
#dataを定義する。
dat = [
[100,'2019-07-01','9997','740'],
[100,'2019-07-02','9997','749'],
[100,'2019-07-03','9997','757'],
[200,'2019-07-01','9997','769'],
[200,'2019-07-02','9997','762'],
[200,'2019-07-03','9997','760']
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print("dfを表示する","\n",df)
#index=100のデータを抽出する。
df=df.loc[idx[100, :], :]
print("dfからindex=100のデータを抽出する。","\n",df)
#index=100,D列のデータを抽出する。
df=df.loc[idx[100, :], ["D"]]
print("dfからindex=100,D列のデータを抽出する。","\n",df)
実行結果
dfを表示する
C D
A B
100 2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 757
200 2019-07-01 9997 769
2019-07-02 9997 762
2019-07-03 9997 760
dfからindex=100のデータを抽出する。
C D
A B
100 2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 757
dfからindex=100,D列のデータを抽出する。
D
A B
100 2019-07-01 740
2019-07-02 749
2019-07-03 757
2-2 DataFrame型の行数、列数を求める。
sample.py
#dataを定義する。
dat = [
[100,'2019-07-01',1,1],
[100,'2019-07-02',0,0],
[200,'2019-07-03',0,1],
[200,'2019-07-01',1,1],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print("dfを表示する","\n",df)
print("DataFrameの行数を計算する",len(df))
print("DataFrameの列数を計算する",len(df.columns))
実行結果
dfを表示する
C D
A B
100 2019-07-01 1 1
2019-07-02 0 0
200 2019-07-03 0 1
2019-07-01 1 1
DataFrameの行数を計算する 4
DataFrameの列数を計算する 2
2-3 DataFrame型の各行ごとの1の個数を数える
sample.py
#dataを定義する。
dat = [
[100,'2019-07-01',1,1],
[100,'2019-07-02',0,0],
[200,'2019-07-03',0,1],
[200,'2019-07-01',1,1],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print(df)
df1=df.loc[idx[100, :], :]
print("dfからindex=100のデータを抽出する。","\n",df1)
print("各行ごとに1の個数を数える")
for i in range(0,len(df1)):
print(str(i)+"行目の1の個数",df1.iloc[i].values.tolist().count(1))
実行結果
C D
A B
100 2019-07-01 1 1
2019-07-02 0 0
200 2019-07-03 0 1
2019-07-01 1 1
dfからindex=100のデータを抽出する。
C D
A B
100 2019-07-01 1 1
2019-07-02 0 0
各行ごとに1の個数を数える
0行目の1の個数 2
1行目の1の個数 0
2-4 DataFrame型の特定列の要素の種類ごとに個数を数える。
sample.py
import pandas as pd
import numpy as np
idx = pd.IndexSlice
#dataを定義する。
dat = [
[100,'2019-07-01',1,1],
[100,'2019-07-02',0,0],
[100,'2019-07-03',1,0],
[100,'2019-07-04',1,0],
[200,'2019-07-03',0,1],
[200,'2019-07-01',1,1],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print(df)
df1=df.loc[idx[100, :], :]
print("dfからindex=100のデータを抽出する。","\n",df1)
print(df1['C'].value_counts())
実行結果
C D
A B
100 2019-07-01 1 1
2019-07-02 0 0
2019-07-03 1 0
2019-07-04 1 0
200 2019-07-03 0 1
2019-07-01 1 1
dfからindex=100のデータを抽出する。
C D
A B
100 2019-07-01 1 1
2019-07-02 0 0
2019-07-03 1 0
2019-07-04 1 0
print("C列の要素の種類ごとに個数を数える。")
C列の要素の種類ごとに個数を数える。
1 3
0 1
Name: C, dtype: int64
2-6 DataFrame型の特定列の数値の正数、負数の個数を求める
sample.py
#dataを定義する。
dat = [
[100,'2019-07-01',1,1],
[100,'2019-07-02',0,-6],
[100,'2019-07-03',1,-2],
[100,'2019-07-04',1,-3],
[200,'2019-07-03',0,-9],
[200,'2019-07-01',1,1],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print(df)
df1=df.loc[idx[100, :], :]
df2p = df1[(df1['D']>0)]
df2n = df1[(df1['D']<0)]
df2z = df1[(df1['D']==0)]
print("df1の正数、負数の個数を数える")
print("pos count",len(df2p))
print("neg count",len(df2n))
print("zero count",len(df2z))
実行結果
C D
A B
100 2019-07-01 1 1
2019-07-02 0 -6
2019-07-03 1 -2
2019-07-04 1 -3
200 2019-07-03 0 -9
2019-07-01 1 1
pos count 1
neg count 3
zero count 0
2-5 DataFrame型の各行ごとに自作関数を適用する。
sample.py
import pandas as pd
import numpy as np
#dataを定義する。
dat = [
[100,'2019-07-01',1,4,9],
[100,'2019-07-02',0,0,7],
[100,'2019-07-01',0,-1,-3],
[100,'2019-07-02',-1,1,6],
[200,'2019-07-03',0,1,2],
[200,'2019-07-01',1,-1,6],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D","E"])
df=df.set_index(["A","B"])
print("df",df)
def func(x):
return x-x.min()
df1=df.apply(func, axis='columns')
print("適用後",df1)
実行結果
df C D E
A B
100 2019-07-01 1 4 9
2019-07-02 0 0 7
2019-07-01 0 -1 -3
2019-07-02 -1 1 6
200 2019-07-03 0 1 2
2019-07-01 1 -1 6
適用後 C D E
A B
100 2019-07-01 0 3 8
2019-07-02 0 0 7
2019-07-01 3 2 0
2019-07-02 0 2 7
200 2019-07-03 0 1 2
2019-07-01 2 0 7
2-6 DataFrame型の各indexごとにデータを正規化する。
sample.py
import pandas as pd
import numpy as np
import scipy.stats
idx = pd.IndexSlice
#dataを定義する。
dat = [
[100,'2019-07-01',2,7],
[100,'2019-07-02',4,77],
[100,'2019-07-01',8,8],
[100,'2019-07-02',16,89],
[200,'2019-07-03',100,9],
[200,'2019-07-01',200,99],
[200,'2019-07-01',400,123],
[200,'2019-07-01',200,345],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
print("df",df)
def transformation_func(s):
return scipy.stats.zscore(s)
#indexごとに、データを正規化する。
print("indexごとに、データを正規化する。")
class_groupby = df.groupby("A")
df1=class_groupby["C"].transform(transformation_func)
df1
実行結果
df C D
A B
100 2019-07-01 2 7
2019-07-02 4 77
2019-07-01 8 8
2019-07-02 16 89
200 2019-07-03 100 9
2019-07-01 200 99
2019-07-01 400 123
2019-07-01 200 345
indexごとに、データを正規化する。
A B
100 2019-07-01 -1.025755
2019-07-02 -0.652753
2019-07-01 0.093250
2019-07-02 1.585258
200 2019-07-03 -1.147079
2019-07-01 -0.229416
2019-07-01 1.605910
2019-07-01 -0.229416
Name: C, dtype: float64
2-7 母集団の統計データを自動計算する。(上位xx%に該当するサンプル値を表示する)
sample.py
import pandas as pd
import numpy as np
dset=np.random.normal(0,3,1000) #データを1000個発生させる
df=pd.DataFrame(dset,columns=['X']) #Dataframe型にする。
dfsta=df.describe(percentiles=[0.2, 0.4, 0.6, 0.8])
print(dfsta)
dfsta60=dfsta.loc['60%', :]
print('dfsta60',dfsta60[0])
実行結果
X
count 1000.000000
mean -0.056981
std 3.056150
min -9.532908
20% -2.625477
40% -0.827265
50% -0.013945
60% 0.665222
80% 2.356556
max 9.736101
X 0.749529
Name: 60%, dtype: float64
2-8 複数のDataframeをDict型で結合する
sample.py
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'D': [10, 11, 12],
'E': [13, 14, 15]},
index=[1, 2, 4])
df2= pd.DataFrame({'D': [0],
'E': [0]},
index=[2])
df3=2*df1
dict1={"X":df1,"Y":df2}
dict2={"Z":df3}
dict2.update(dict1)
print(dict2)
実行結果
{'Z': D E
1 20 26
2 22 28
4 24 30, 'X': D E
1 10 13
2 11 14
4 12 15, 'Y': D E
2 0 0}
2-9 重複を除いた数値の個数を数える。列に含まれる要素を重複排除し列挙する
sample.py
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'D': [1, 1, 2],
'E': [13, 14, 15]},
index=[1, 2, 4])
print(df1)
u = df1 ['D'].unique()
print("D列の数字の個数。ただし重複は除く")
print(len(u))
実行結果
D E
1 1 13
2 1 14
4 2 15
D列の数字の個数。ただし重複は除く
2
###2-10 DateFrameを2つのkeyで昇順にソートする方法