はじめに
- バージョン
- Python: 3.6.8
- pandas: 1.1.5
- 概要
- 以下のようなyamlがある時に、pandasを使うと見やすくかつシンプルに表が作成出来るので紹介します。
member.yml
---
member:
- name: "Aoki"
age: 23
- name: "Akiyama"
age: 38
- name: "Tom"
age: 31
今回紹介するのは以下のパターンです。
-
- yamlから表を作成する
-
- 表の列に対して関数を適用する
- ageが30以上であるかを判定し、True/Falseを返す
-
- 関数の結果を新たな列として追加する
1. サンプルコード
実際に作成したコードは以下です。
test_pandas.py
import pandas as pd
import yaml
def read_yml(input_file):
with open(input_file, "r") as yml:
yml_data = yaml.load(yml, Loader=yaml.SafeLoader)
return yml_data
def check_age(age):
return age >= 30
def main():
print("1. yaml to dataframe")
file_yaml = read_yml("./member.yml")
file_df = pd.DataFrame(data=file_yaml["member"]) # point-1
print(file_df)
print("")
print("2. apply function")
print(file_df["age"].apply(check_age)) # point-2
print("")
print("3. merge function result")
file_df["result"] = file_df["age"].apply(check_age) # point-3
print(file_df)
if __name__ == "__main__":
main()
- ポイント
-
- yamlから表を作成する
-
以下のように、
data=
の部分に表にしたいデータを記載します。pd.DataFrame(data=表にしたいデータ])
-
- 列に対して関数を適用する
-
以下のように、DataFrameに関数を適用するには
.apply
と記載します。DataFrame名[列名].apply(関数名)
-
- 関数の結果を新たな列として追加する
-
以下のように、左辺に新たに追加する列を、右辺に追加するDataFrameを記載します。
DataFrame名[追加する列名] = 追加するDataFrame名
-
2. 実行結果
- 実行ログ
- 変数の中身がわかるように適宜printしているので、詳しく見ていきましょう。
(venv) [centos@ip-<ip addr> pandas]$ python3 test_pandas.py
1. yaml to dataframe
name age
0 Aoki 23
1 Akiyama 38
2 Tom 31
2. apply function
0 False
1 True
2 True
Name: age, dtype: bool
3. merge function result
name age result
0 Aoki 23 False
1 Akiyama 38 True
2 Tom 31 True
-
- yaml読み取り後
- 一番左の行番号は自動で割り振ってくれます。
- yaml読み取り後
- | name | age |
---|---|---|
0 | Aoki | 23 |
1 | Akiyama | 38 |
2 | Tom | 31 |
-
- 関数適用後
- 列(age)に関数を適用した結果が返ってくるので、他の列(name)の結果は表示されません。
- 関数適用後
- | - |
---|---|
0 | False |
1 | True |
2 | True |
-
- 関数の結果とのマージ後
- 関数の結果が列名resultとして追加されています。
- 関数の結果とのマージ後
- | name | age | result |
---|---|---|---|
0 | Aoki | 23 | False |
1 | Akiyama | 38 | True |
2 | Tom | 31 | True |
まとめ
pandasを使いこなせば、for文を使わずに一気に全てのデータに関数を適用できるので便利だと感じます。