見出し画像

[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"を気に入って頂けましたら、是非サポートをお願いいたします!