Python - DataFrameでソートと反転を行う

DataFrameではソートや反転を容易に行うことができます。

ソート

ソートするにはDataFrameのsort_values関数を使います。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

# 身長・体重・性別のデータフレームを作成
tbl = pd.DataFrame({
'weight': [80.0, 70.4, 65.5, 45.9, 51.2, 72.5],
'height': [170, 180, 155, 143, 154, 160],
'gender': ['f', 'm', 'm', 'f', 'f', 'm']
})

print('身長をキーにソート')
print(tbl.sort_values(by='height'))
print()

print('体重を降順でソート')
print(tbl.sort_values(by='weight', ascending=False))

実行結果は下記のとおりです。

[実行結果]

身長をキーにソート
   weight  height gender
3    45.9     143      f
4    51.2     154      f
2    65.5     155      m
5    72.5     160      m
0    80.0     170      f
1    70.4     180      m

体重を降順でソート
   weight  height gender
0    80.0     170      f
5    72.5     160      m
1    70.4     180      m
2    65.5     155      m
4    51.2     154      f
3    45.9     143      f

反転

反転するにはDataFrameのT属性を参照します。

[コード]

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd

tbl = pd.DataFrame([
['A', 'B', 'C'],
['D', 'E', 'F'],
['G', 'H', 'I']
])

print(tbl)
print('----')
print(tbl.T)

実行結果は下記のとおりです。

[実行結果]

   0  1  2
0  A  B  C
1  D  E  F
2  G  H  I
----
   0  1  2
0  A  D  G
1  B  E  H
2  C  F  I

Python - DataFrameで任意のデータ抽出

DataFrameでは任意のデータを容易に抽出することができます。

キーでのデータ抽出

まず1次元のリストが入った辞書型データよりデータフレームを作成します。

このデータに対して、キーを指定することにより任意の列のデータを取得することができます。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd

# 身長・体重・性別のデータフレームを作成
tbl = pd.DataFrame({
'weight': [80.0, 70.4, 65.5, 45.9, 51.2, 72.5],
'height': [170, 180, 155, 143, 154, 160],
'gender': ['f', 'm', 'm', 'f', 'f', 'm']
})

# 体重の一覧を表示
print('体重の一覧')
print(tbl['weight'])
print()

# 体重と身長の一覧を表示
print('体重と身長の一覧')
print(tbl[['weight', 'height']])

実行結果は下記のとおりです。

[実行結果]

体重の一覧
0    80.0
1    70.4
2    65.5
3    45.9
4    51.2
5    72.5
Name: weight, dtype: float64

体重と身長の一覧
   weight  height
0    80.0     170
1    70.4     180
2    65.5     155
3    45.9     143
4    51.2     154
5    72.5     160

スライスでのデータ抽出

任意の行を抽出したい場合は、Pythonの標準型であるリストを同じようにスライスを使うことができます。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

# 身長・体重・性別のデータフレームを作成
tbl = pd.DataFrame({
'weight': [80.0, 70.4, 65.5, 45.9, 51.2, 72.5],
'height': [170, 180, 155, 143, 154, 160],
'gender': ['f', 'm', 'm', 'f', 'f', 'm']
})

# (0から数えて)2から3つ目のデータを表示
print('tbl[2:4]\n', tbl[2:4])
print()

# (0から数えて)3つ目以降のデータを表示
print('tbl[3s:]\n', tbl[3:])

実行結果は下記のとおりです。

[実行結果]

    weight  height gender
2    65.5     155      m
3    45.9     143      f

    weight  height gender
3    45.9     143      f
4    51.2     154      f
5    72.5     160      m

条件でのデータ抽出

条件を指定することにより、条件に合致したデータを抽出することができます。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd

# 身長・体重・性別のデータフレームを作成
tbl = pd.DataFrame({
'weight': [80.0, 70.4, 65.5, 45.9, 51.2, 72.5],
'height': [170, 180, 155, 143, 154, 160],
'gender': ['f', 'm', 'm', 'f', 'f', 'm']
})

print('身長が160以上のデータを表示')
print(tbl[tbl.height >= 160])
print()

print('性別が m のデータを表示')
print(tbl[tbl.gender == 'm'])

実行結果は下記のとおりです。

[実行結果]

身長が160以上のデータを表示
   weight  height gender
0    80.0     170      f
1    70.4     180      m
5    72.5     160      m

性別が m のデータを表示
   weight  height gender
1    70.4     180      m
2    65.5     155      m
5    72.5     160      m

Python - Pandasの基本データ

Pandasで扱う基本データは、DataFrameSiriesです。

DataFrame

DataFrameを定義するには、2次元のリストを引数に与えます。

[コード]

1
2
3
4
5
6
7
8
9
import pandas as pd

x = pd.DataFrame([
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
])

print(x)

実行結果は下記のとおりです。

[実行結果]

    0   1   2
0  10  20  30
1  40  50  60
2  70  80  90

実際のデータのほかに、列や行を意味するラベルも一緒に表示されていることが分かります。

Series

Seriesを定義するには、1次元のリストを引数に与えます。

[コード]

1
2
3
4
5
import pandas as pd

x = pd.Series([1.0, 3.0, 5.0, 7.0])

print(x)

実行結果は下記のとおりです。

[実行結果]

0    1.0
1    3.0
2    5.0
3    7.0
dtype: float64

インデックス番号付きで表示されるのが確認できます。また、データ型についても表示されます。

Python scikit-learn - アヤメの品種分類をクロスバリデーションで行う

アヤメの品種分類をクロスバリデーションで行います。

クロスバリデーションとは、最初に全てのデータを訓練データとテストデータに分割して、訓練データを用いて学習を行い、テストデータを用いて学習の妥当性を検証する手法です。

クロスバリデーションにはいろいろな手法がありますが、今回はK分割交差法をご紹介します。

【例 集合XをA,B,Cと3分割する場合】

(1) 集合Xを、AとBとCに分割します。
(2) Aとテストデータ、残りのB,Cを訓練データとして分類精度s1を求めます。
(3) Bとテストデータ、残りのA,Cを訓練データとして分類精度s1を求めます。
(4) Cとテストデータ、残りのA,Bを訓練データとして分類精度s1を求めます。
(5) 分類精度s1,s2,s3の平均を求め分類精度とします。

クロスバリデーション

実行するコードは下記の通りです。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
from sklearn import svm, metrics, model_selection, datasets

# アヤメのCSVデータを読み込む
iris = datasets.load_iris()

# データの学習
clf = svm.SVC()
scores = model_selection.cross_val_score(clf, iris.data, iris.target, cv=5)

# 正答率を求める
print('各正解率:', scores)
print('正解率:', scores.mean())

9行目のcv=5で分割数を5に設定しています。

model_selection.cross_val_score関数1つで、複数回の検証を行えるのは大変便利です。


実行結果は次のようになります。

[実行結果]

各正解率: [0.96666667 0.96666667 0.96666667 0.93333333 1.        ]
正解率: 0.9666666666666666

正答率96%以上と十分な結果となります。

Python scikit-learn - 機械学習でアヤメの品種を分類する

機械学習でアヤメの品種を分類します。

機械学習でアヤメの品種分類

scikit-learn には、機械学習やデータマイニングを試すことができるようデータが同梱されています。

iris.dataには次の4種類のデータが格納されています。

カラム内容
sepal length (cm)がく片の長さ
sepal width (cm)がく片の幅
petal length (cm)花弁の長さ
petal width (cm)花弁の幅

iris.targetには次の3種類の花の種類が格納されています。

花の種類
setosa0
versicolor1
virginica2

実行するコードは下記の通りです。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
from sklearn import svm, metrics, model_selection, datasets

# アヤメのCSVデータを読み込む
iris = datasets.load_iris()

# 学習用とテスト用に分離する
train_data, test_data, train_label, test_label = model_selection.train_test_split(iris.data, iris.target, test_size=0.2, train_size=0.8, shuffle = True)

# データの学習
clf = svm.SVC()
clf.fit(train_data, train_label)

# データを予測
pre = clf.predict(test_data)

# 正答率を求める
ac_score = metrics.accuracy_score(test_label, pre)
print('正解率:', ac_score)

学習用とテスト用にデータを分離し、シャッフルまで行ってくれるmodel_selection.train_test_split(7行目)はとても便利です。


実行結果は次のようになります。

[実行結果]

正解率: 0.9333333333333333

正答率93%以上と十分な結果となりました。

Python scikit-learn - フレームワークで排他的論理和(XOR)演算を学習する

排他的論理和(XOR)に関しての機械学習ですが、次の2点に関してフレームワークを利用する処理に変更します。

  • データとラベルを分割する。
  • 正解率を求める。

フレームワークで排他的論理和(XOR)演算を学習する

「データとラベルの分割」と「正解率を求める」箇所を変更します。

変更前のコードをコメントアウトしているので参考にして下さい。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import pandas as pd                 # 追加
from sklearn import svm, metrics # metrics追加

# XORの演算と結果
xor_data = [
[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 0]
]

# 学習させるためにデータとラベルに分ける

# [変更前]
#data = []
#label = []
#for row in xor_data:
# data.append([row[0], row[1]])
# label.append(row[2])

# [変更後]
xor_df = pd.DataFrame(xor_data)
data = xor_df.iloc[:,0:2] # データ
label = xor_df.iloc[:,2] # ラベル

# データの学習
clf = svm.SVC()
clf.fit(data, label)

# データを予測
pre = clf.predict(data)
print('予測結果:', pre)

# 正解と合っているか結果を確認

# [変更前]
#cnt_ok = 0
#total = 0
#for idx, ans in enumerate(label):
# if pre[idx] == ans:
# cnt_ok += 1
# total += 1
#print('正解率:{} / {}'.format(cnt_ok, cnt_ok / total))

# [変更後]
ac_score = metrics.accuracy_score(label, pre)
print('正解率:', ac_score)

実行結果は次のようになります。

[実行結果]

予測結果: [0 1 1 0]
正解率: 1.0

変更前に比べてかなり短いコードで同様の結果が得られることが分かります。

Python scikit-learn - 排他的論理和(XOR)演算を学習する

機械学習で排他的論理和(XOR)を学習します。

排他的論理和(XOR)とは、2つの入力のどちらか片方が真で、もう片方が偽の時には結果が真となり、両方とも真あるいは両方とも偽のときには偽となる演算です。

排他的論理和(XOR)演算を学習する

scikit-learnという機械学習用のライブラリを使います。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from sklearn import svm

# XORの演算と結果
xor_data = [
[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 0]
]

# 学習させるためにデータとラベルに分ける
data = []
label = []

for row in xor_data:
data.append([row[0], row[1]])
label.append(row[2])

# データの学習
clf = svm.SVC()
clf.fit(data, label)

# データを予測
pre = clf.predict(data)
print('予測結果:', pre)

# 正解と合っているか結果を確認
cnt_ok = 0
total = 0

for idx, ans in enumerate(label):
if pre[idx] == ans:
cnt_ok += 1
total += 1

print('正解率:{} / {}'.format(cnt_ok, cnt_ok / total))

実行結果は次のようになります。

[実行結果]

予測結果: [0 1 1 0]
正解率:4 / 1.0

4つのデータにおいて4つ正解しており、正解率は100%であることが分かります。

Python Pandas - エクセルファイルの読み込み

Pandasを使ってエクセルファイルの読み込みを行います。

エクセルファイルの書き込み

次のエクセルファイルを読み込みます。

data.xls

読み込み処理は以下の通りです。

read_excel関数を使い、1行でエクセルファイルの読み込みが行えます。

またsort_values関数を使えば特定のキーでソート(並び替え)を行うことができます。

[コード]

1
2
3
4
5
6
7
import pandas as pd

book = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print(book)
print()

print(book.sort_values(by='データ1', ascending=False))

実行結果は次のようになります。

[実行結果]

  都道府県  データ1  データ2
0   東京    10    40
1  北海道    20     5
2   京都    30    60

  都道府県  データ1  データ2
2   京都    30    60
1  北海道    20     5
0   東京    10    40

Python - CSVの読み書き

Ptyhonでcsvファイルの読み書きを行います。

CSVファイルの書き込み

Pythonで標準機能のcsvライブラリを使い、CSVファイルを出力します。

[コード]

1
2
3
4
5
6
7
8
import csv

with open('test.csv', 'w') as f:
writer = csv.writer(f, delimiter=',', quotechar='"',lineterminator='\n')
writer.writerow(['ID', '商品名', '値段'])
writer.writerow(['10', 'SDカード', '500'])
writer.writerow(['20', 'マウス', '300'])
writer.writerow(['30', 'マジック(赤,青)', '150'])

実行すると次のようなCSVファイルが出力されます。

[出力されるCSVファイル]

ID,商品名,値段
10,SDカード,500
20,マウス,300
30,"マジック(赤,青)",150

カンマのあるデータは、quotecharで指定した文字(ダブルクォーテーション)でくくられます。

CSVファイルの読み込み

上記で出力したCSVファイルを読み込んでみます。

[コード]

1
2
3
4
5
6
import csv

with open('test.csv', 'r') as f:
reader = csv.reader(f, delimiter=',', quotechar='"')
for cells in reader:
print(cells)

実行結果は下記の通りです。

[実行結果]

['ID', '商品名', '値段']
['10', 'SDカード', '500']
['20', 'マウス', '300']
['30', 'マジック(赤,青)', '150']

ダブルクォーテーションでくくられた中にカンマがある場合も、問題なく1つの要素として読み込まれていることが分かります。

Python - YAMLの読み書き

PtyhonのデータをYAML形式のデータにしたり、YAML形式のデータをPythonのデータにパースしたりしてみます。

YAMの読み書き

yaml.load()関数でYAML文字列をPythonデータに変換し、yaml.dump()関数でPythonデータをYAML形式で出力します。

[コード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import yaml

data = [
{"name":"Yamada", "age":"33", "gender":"man"},
{"name":"Sato", "age":"58", "gender":"woman"},
{"name":"Kato", "age":"42", "gender":"man"},
{"name":"Nishi", "age":"22", "gender":"man"}
]

# PythonのデータをYAMLに変換
str = yaml.dump(data)
print(str)
print('--- --- ---')

# YAMLをPythonデータに変換
data1 = yaml.load(str)

# Pythonデータを表示
for p in data1:
print(p)

実行結果は下記の通りです。

[実行結果]

- age: '33'
  gender: man
  name: Yamada
- age: '58'
  gender: woman
  name: Sato
- age: '42'
  gender: man
  name: Kato
- age: '22'
  gender: man
  name: Nishi
--- --- ---
{'age': '33', 'gender': 'man', 'name': 'Yamada'}
{'age': '58', 'gender': 'woman', 'name': 'Sato'}
{'age': '42', 'gender': 'man', 'name': 'Kato'}
{'age': '22', 'gender': 'man', 'name': 'Nishi'}
© 2026 Playing with Python All Rights Reserved.
Theme by hipaper