[Python] Pandasの基礎 (DataFrame)
Pandasのデータ構造 "DataFrame" は Seriesを束ねたような2次元のデータ構造を持ちます。pd.DataFrame() に Seriesを渡すことで DataFrameを生成することができます。
DataFrameの生成
先ずは series1, series2 から DataFrameを生成して df に代入してみます。
series の代入は pd.DataFrame( [Series, Series, . . .] ) とするだけです。
import pandas as pd
index = [ "apple", "orange", "banana", "strawberry", "kiwifruit"]
data1 = [9, 5, 4, 2, 11]
data2 = [20, 17, 4, 21, 8]
data3 = [30, 12, 9, 1, 23] # 後ほど使用
series1 = pd.Series(data1, index=index)
series2 = pd.Series(data2, index=index)
# series1とseries2からDataFrameを作る
df = pd.DataFrame([series1,series2])
print(df)
## 実行結果 ##
apple orange banana strawberry kiwifruit
0 9 5 4 2 11
1 20 17 4 21 8
Indexの操作
Indexの操作も出来ます (defaultでは0から採番される)
df.index = [10,11]
print(df)
## 実行結果 ##
apple orange banana strawberry kiwifruit
10 9 5 4 2 11
11 20 17 4 21 8
行の追加
次に、行の追加をやってみる。↑にある(# 後ほど使用)の data3で Series3 を生成。それを df に appendメソッドで追加してあげる。
series3 = pd.Series(data3, index=index)
print()
#dfに再代入する
df = df.append(series3, ignore_index=True)
print(df)
# 実行結果
apple orange banana strawberry kiwifruit
0 9 5 4 2 11
1 20 17 4 21 8
2 30 12 9 1 23 << 追加される
列の追加
列の追加もやってみる。df["xxxxx"] = new_colum
new_colum = pd.DataFrame([15,7,1])
print("新しい列のデータ")
print(new_colum)
print()
#"indexに mango を追加して↑のnew_columを与える"
df["mango"] = new_colum
print(df)
# 実行結果
新しい列のデータ
0
0 15
1 7
2 1
apple orange banana strawberry kiwifruit mango
0 9 5 4 2 11 15
1 20 17 4 21 8 7
2 30 12 9 1 23 1
フィルタリング
DataFrameの特定部分を抜き出すこともできる。
以下の例では appleと mangoの列の 0, 2 (index) を指定して抽出。
df_filter = df.loc[[0,2],["apple", "mango"]]
print(df_filter)
# 実行結果
apple mango
0 9 15
2 30 1
番号参照、スライス操作
番号による参照もできるし、スライスも使える。
"""
番号参照
"""
df_filter_num = df.iloc[[0,2],[0,3]] (行のリスト=0,2、列のリスト=0(apple),3(strawberry))
print(df_filter_num)
# 実行結果
apple strawberry
0 9 2
2 30 1
"""
スライス
"""
df_filter_slice = df.iloc[0:,1:3]
print(df_filter_slice)
# 実行結果
orange banana
0 5 4
1 17 4
2 12 9
行・列の削除、条件フィルタリング
続いて、各 colum indexに 1- 10でランダム値を割り当て、そこから 3〜5の値を抽出するプログラム。
import pandas as pd
import numpy as np
colums_test = ["apple", "orange", "banana", "strawberry", "kiwifruit"]
df_test = pd.DataFrame()
#np.random.seed(0) << 乱数を固定したい場合は コメントアウト
for colum in colums_test:
df_test[colum] = np.random.choice(range(1,11),10) # 1から10までの値をランダムにあてはめる x 10回繰り返す
df_test.index = range(1,11) # index を 1-10で割り当てる
print(df_test)
print()
print("=========================================")
print("↓ 抽出した DataFrame ↓")
df_test_filter = df_test.loc[range(2,6),["banana", "kiwifruit"]]
print(df_test_filter)
# 実行結果
apple orange banana strawberry kiwifruit
1 1 5 4 10 8
2 2 4 5 2 6
3 5 8 2 7 3
4 3 7 3 6 8
5 4 10 6 7 5
6 9 8 5 3 7
7 3 7 8 2 4
8 5 9 5 3 1
9 7 8 4 7 9
10 6 10 9 1 9
=========================================
↓ 抽出した DataFrame ↓
banana kiwifruit
2 5 6
3 2 3
4 3 8
5 6 5
今度は、↑のDataFrame(df_test)にたいして、dropメソッドを使って、奇数のインデックス行のみを残してみる。
df_odd = df_test.drop(np.arange(2,11,2)) #2から10までの間の整数の差が2になるように抜き出す
print(df_odd)
# 実行結果
apple orange banana strawberry kiwifruit
1 3 8 10 4 5
3 2 8 3 2 5
5 1 1 7 10 3
7 6 5 2 3 5
9 4 2 4 3 3
特定の列を削除
df_del_colum = df_test.drop("kiwifruit", axis=1)
print(df_del_colum)
# 実行結果
apple orange banana strawberry
1 3 8 10 4
2 7 4 9 4
3 2 8 3 2
4 8 6 6 8
5 1 1 7 10
6 1 3 3 5
7 6 5 2 3
8 7 3 1 8
9 4 2 4 3
10 2 6 8 8
条件付きでフィルタリング
"""
appleのデータが5以上のもの行のみ
"""
df_fl = df_test.loc[df_test["apple"] >= 5]
print(df_fl)
# 実行結果
apple orange banana strawberry kiwifruit
2 7 4 9 4 10
4 8 6 6 8 1
7 6 5 2 3 5
8 7 3 1 8 5
ソート機能
以下のように、ソートもできちゃいます。これ結構重要かも。
import pandas as pd
# 辞書型で作成
data = {"fruits": [ "apple", "orange", "banana", "strawberry", "kiwifruit"],
"year":[2001, 2002, 2003, 2004, 2005],
"time": [1, 4, 5, 6, 3]
}
df = pd.DataFrame(data)
print("ソート前")
print(df)
print()
df_sort = df.sort_values(by="time", ascending = True)
print("ソート後")
print(df_sort)
# 実行結果
ソート前
fruits time year
0 apple 1 2001
1 orange 4 2002
2 banana 5 2003
3 strawberry 6 2004
4 kiwifruit 3 2005
ソート後
fruits time year
0 apple 1 2001
4 kiwifruit 3 2005
1 orange 4 2002
2 banana 5 2003
3 strawberry 6 2004
基礎編はここらへんにして、次回は Pandasの応用編にチャレンジしてみます!
今回の"note"を気に入って頂けましたら、是非サポートをお願いいたします!