質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

883閲覧

データフレームを用いた集合について

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/01/18 05:24

日本のイベントをまとめたデータフレーム【df_event】があります。
df_event["協賛会社"]のデータから、matplotlibで可視化をしたいと考えています。

df_event["協賛会社"]のデータをdf_event["開催(西暦)"]と紐付けて年代別にカウントをしようと考えています。
集合の & などを使ってみましたが、エラーが発生してしまいます。。
何かいい方法はないでしょうか?
どなたかお力添えをよろしくお願いいたします。。

【df_event】
|イベント名|都道府県名|費用(万円)|協賛会社|開催(西暦)|
|:--|:--:|--:|
|〇〇祭り|北海道|780|A社|1985|
|□□大会|北海道|467|B社|1940|
|・|・|・|・|・|
|△△パーティー|東京都|428|C社、D社|2007|
|●●祭|神奈川県|591|E社、F社、A社|2002|
|・|・|・|・|・|
|✖︎✖︎生誕祭|大阪府|227|G社、B社|1967|
|■■ディナーショー|大阪府|74|C社|1999|
|・|・|・|・|・|・|
|▲▲イベント|沖縄|356|D社、E社、F社|1963|

【現状】

Python

1[In] 2df_company = df_event['協賛会社'] 3df_1980_1989 = df_event.query('開催(西暦) == [1980,1981,1982,1983,1984,1985,1986,1987,1988,1989]') 4df_company_1980_1989 = df_company & df_1980_1989 5df_company_1980_1989 6--------------------------------------------------------- 7[Out] 8TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool] 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2020/01/19 04:27

こんにちは。回答しましたが、ご質問の要件を誤読した回答になっているかもしれず、その場合は申し訳ありません。私の回答は、「ある年に何社が協賛したか」を数えるものでした。その際に、「ある年にある一企業が2つ以上のイベントに協賛していても、それは1と数える」ということが要件と思ってしまっておりました。
guest

回答2

0

ベストアンサー

前処理として 協賛会社列の社名を.str.split(expand=True) してその結果を unstack() することで会社を行に展開します。で、その結果を元のデータフレームとmerge()することで下記のような協賛会社を展開したデータフレームを作成します。

Python

1import pandas as pd 2import io 3 4csv = """ 5イベント名,都道府県名,費用(万円),協賛会社,開催(西暦) 6〇〇祭り,北海道,780,A社,1985 7□□大会,北海道,467,B社,1940 8△△パーティー,東京都,428,C社、D社,1999 9●●祭,神奈川県,591,E社、F社、A社,1963 10✖︎✖︎生誕祭,大阪府,227,G社、D社,1967 11■■ディナーショー,大阪府,74,C社,1999 12▲▲イベント,沖縄,356,D社、E社、F社,1963 13""" 14 15df = pd.read_csv(io.StringIO(csv)) 16 17# 協賛会社を行に展開 18tmp = df['協賛会社'].str.split('、', expand=True).unstack().rename('協賛会社') 19# 無効な行を削除 20tmp = tmp.reset_index(level=0).dropna() 21# 元のデータフレームとマージ 22df = df.drop(columns=['協賛会社']).merge(tmp, left_index=True, right_index=True, how='right') 23print(df) 24# イベント名 都道府県名 費用(万円) 開催(西暦) level_0 協賛会社 25#0 〇〇祭り 北海道 780 1985 0 A社 26#1 □□大会 北海道 467 1940 0 B社 27#2 △△パーティー 東京都 428 1999 0 C社 28#2 △△パーティー 東京都 428 1999 1 D社 29#3 ●●祭 神奈川県 591 1963 0 E社 30#3 ●●祭 神奈川県 591 1963 1 F社 31#3 ●●祭 神奈川県 591 1963 2 A社 32#4 ✖︎✖︎生誕祭 大阪府 227 1967 0 G社 33#4 ✖︎✖︎生誕祭 大阪府 227 1967 1 D社 34#5 ■■ディナーショー 大阪府 74 1999 0 C社 35#6 ▲▲イベント 沖縄 356 1963 0 D社 36#6 ▲▲イベント 沖縄 356 1963 1 E社 37#6 ▲▲イベント 沖縄 356 1963 2 F社

上記のようなデータフレームができたら、あとは通常通り groupby.count()で簡単に集計できます。

Python

1result = df.groupby(['開催(西暦)', '協賛会社'])['イベント名'].count() 2print(result) 3#開催(西暦) 協賛会社 4#1940 B社 1 5#1963 A社 1 6# D社 1 7# E社 2 8# F社 2 9#1967 D社 1 10# G社 1 11#1985 A社 1 12#1999 C社 2 13# D社 1 14#Name: イベント名, dtype: int64

投稿2020/01/18 09:15

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/18 12:16

ご回答ありがとうございます! df = pd.read_csv(io.StringIO(csv))の(csv)の部分は実際のCSVファイル(’event_file.csv’)を打ち込んでも動作しますでしょうか? それとも、 csv = """ ・ ・ """ のようにデータを指定しなければいけませんか?
magichan

2020/01/18 12:58

df = pd.read_csv(’event_file.csv’) で大丈夫です。 io.StringIO(csv) は文字列をファイルのように振舞わせるためのものです。
退会済みユーザー

退会済みユーザー

2020/01/19 10:24

ありがとうございます! ちなみに協賛会社のA社のみをピックアップして開催(西暦)とplot(折れ線グラフ)するにはどうすればいいでしょうか? 下記のコードを書くと、yのデータとリンクしないグラフになってしまいます。。 y = df_event[df_event['協賛会社'] == "A社"].groupby('開催(西暦)').count()["協賛会社"].sort_values(ascending=False) x = [1959, 1960,1961,1962,1963,1964,1965,1966,1967,1968,1969, 1970,1971,1972,1973,1974,1975,1976,1977,1978,1979, 1980,1981,1982,1983,1984,1985,1986,1987,1988,1989, 1990,1991,1992,1993,1994,1995,1996,1997,1998,1999, 2000,2001,2002,2003,2004,2005,2006,2007,2008,2009, 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,] plt.plot(x, y)
退会済みユーザー

退会済みユーザー

2020/01/19 10:28

.sort_values(ascending=False)が原因でした。。 失礼しましたm(_ _)m
guest

0

こんにちは

以下、もっと上手い書き方があるのではと思いますが、要件を、一応満たせたのではと思うコードが出来たので、回答します。

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

投稿2020/01/18 06:44

編集2020/01/18 12:17
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/19 08:36

ご回答を何度も何度もありがとうございます! 色々試行錯誤しながらコードを使わせていただきました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問