LoginSignup
0
0

More than 1 year has passed since last update.

Pandasの使い方2

Last updated at Posted at 2020-11-18

#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で昇順にソートする方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0