Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

つとむ先生のpandasドリル【生徒ごとの教科名の一覧の列を追加するには?】

f:id:kenken0326:20210203150531p:plain

f:id:kenken0326:20191021153602p:plain
tsutomu こんにちはPyQチームのtsutomuです。
pandasドリル第13回の問題は「生徒ごとの教科名の一覧の列を追加するには?」です。

つとむ先生の紹介

20数年、最適化関連の案件に従事するビープラウドの技術士(情報工学)。2014年より最適化のモデル作成にPythonを使い始め、効率的に開発できるようになる。東京海洋大学、青山学院大学、慶應義塾大学、上智大学に非常勤講師としての勤務経験がある。また、オペレーションズ・リサーチ学会に約30年所属し、理事を2期務めた。フェロー。
主な著書はモデリングの諸相Python言語によるビジネスアナリティクス今日から使える!組合せ最適化データ分析ライブラリーを用いた最適化モデルの作り方

問題

f:id:kenken0326:20191021153602p:plain
tsutomu DataFrame型の変数dfに、テストの結果が入っています。
DataFrame型の変数dfclに、生徒の所属クラスが入っています。

dfclに、dfの生徒ごとの教科名の一覧の列を追加して、下記のようなDataFrameを作成し、変数resultに入れてください。

変数dfの内容

Name Subject Point
0 Alice 国語 87
1 Alice 算数 72
2 Bob 国語 65
3 Bob 算数 92

変数dfclの内容

Name Class
0 Alice 1-A
1 Bob 1-B

変数dfclに入るべきDataFrame

Name Class Subject
0 Alice 1-A 国語/算数
1 Bob 1-B 国語/算数

問題で使うDataFrame①

import pandas as pd

df = pd.DataFrame(
    [
        ['Alice', '国語', 87],
        ['Alice', '算数', 72],
        ['Bob', '国語', 65],
        ['Bob', '算数', 92],
    ],
    columns=['Name', 'Subject', 'Point'])
df

問題で使うDataFrame②

dfcl = pd.DataFrame(
    [['Alice', '1-A'], ['Bob', '1-B']], columns=['Name', 'Class'])
dfcl

回答

result = dfcl.join(df.groupby('Name').Subject.apply('/'.join), 'Name')

解説

df.groupby('Name')でNameごとにグルーピングします。

回答のSubject.apply('/'.join)で、生徒ごとの教科を「/」で連結します。'/'.joinがメソッドであることに注意してください。

Subject.apply(lambda x: '/'.join(x))とも書けますが、冗長です。

df.groupby('Name').Subject.apply('/'.join)は、Nameをインデックスとしているので、DataFrame.joinで結合できます。

前回の問題

第12回つとむ先生のpandasドリル【合計の列の小さい順にソートするには?】はこちらからご覧ください。

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.