こんにちは
以下、もっと上手い書き方があるのではと思いますが、要件を、一応満たせたのではと思うコードが出来たので、回答します。
df_eventの元になるevent.csv
が以下であるとします。(set で重複が除去されることを確認するため、ご質問にあるデータを修正しています)
CSV
1イベント名,都道府県名,費用(万円),協賛会社,開催(西暦)
2〇〇祭り,北海道,780,A社,1985
3□□大会,北海道,467,B社,1940
4△△パーティー,東京都,428,C社、D社,1999
5●●祭,神奈川県,591,E社、F社、A社,1963
6✖︎✖︎生誕祭,大阪府,227,G社、D社,1967
7■■ディナーショー,大阪府,74,C社,1999
8▲▲イベント,沖縄,356,D社、E社、F社,1963
上記に対して、以下のコード
python3
1import pandas as pd
2
3
4df_event = pd.read_csv('event.csv')
5
6df_event["_協賛会社list"] = df_event["協賛会社"].str.split('、')
7
8print(df_event[["開催(西暦)", "_協賛会社list"]])
9print('----------')
10
11df_count = df_event[["開催(西暦)", "_協賛会社list"]].groupby("開催(西暦)").sum()
12
13df_count["_協賛会社set"] = [set(x) for x in df_count["_協賛会社list"]]
14df_count["協賛会社数"] = [len(s) for s in df_count["_協賛会社set"]]
15
16
17print(df_count)
18
を実行すると、下記の出力が得られます。
開催(西暦) _協賛会社list
0 1985 [A社]
1 1940 [B社]
2 1999 [C社, D社]
3 1963 [E社, F社, A社]
4 1967 [G社, D社]
5 1999 [C社]
6 1963 [D社, E社, F社]
----------
_協賛会社list _協賛会社set 協賛会社数
開催(西暦)
1940 [B社] {B社} 1
1963 [E社, F社, A社, D社, E社, F社] {F社, D社, E社, A社} 4
1967 [G社, D社] {D社, G社} 2
1985 [A社] {A社} 1
1999 [C社, D社, C社] {D社, C社} 2
_協賛会社list
列と _協賛会社Set
列は中間生成物なので、削除したほうがよいと思いますが、コードの意図を明確にするため、残してあります。
参考になれば幸いです。
追記
複数の集合の和集合を作る set.union
を使うと、上記のコードでリストを連結してから set にしていたのを、集合の演算のみで出来ました。
import pandas as pd
df_event = pd.read_csv('event.csv')
df_event["_協賛会社set"] = [set(lis) for lis in df_event["協賛会社"].str.split('、')]
print(df_event[["開催(西暦)", "_協賛会社set"]])
print('----------')
df_count = df_event[
["開催(西暦)", "_協賛会社set"]
].groupby("開催(西暦)").agg(lambda sets: len(set.union( * sets.values)))
df_count.rename(columns = {
"_協賛会社set": "協賛会社数"
}, inplace = True)
del df_event["_協賛会社set"]
print(df_count)
上記を実行すると、下記の出力が得られます。
開催(西暦) _協賛会社set
0 1985 {A社}
1 1940 {B社}
2 1999 {D社, C社}
3 1963 {F社, A社, E社}
4 1967 {D社, G社}
5 1999 {C社}
6 1963 {F社, D社, E社}
----------
協賛会社数
開催(西暦)
1940 1
1963 4
1967 2
1985 1
1999 2