pandasドリル第13回の問題は「生徒ごとの教科名の一覧の列を追加するには?」です。
つとむ先生の紹介
20数年、最適化関連の案件に従事するビープラウドの技術士(情報工学)。2014年より最適化のモデル作成にPythonを使い始め、効率的に開発できるようになる。東京海洋大学、青山学院大学、慶應義塾大学、上智大学に非常勤講師としての勤務経験がある。また、オペレーションズ・リサーチ学会に約30年所属し、理事を2期務めた。フェロー。
主な著書はモデリングの諸相、Python言語によるビジネスアナリティクス、今日から使える!組合せ最適化、データ分析ライブラリーを用いた最適化モデルの作り方
問題
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ドリル【合計の列の小さい順にソートするには?】はこちらからご覧ください。