🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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回答

1313閲覧

年代ごとにカウントしたグラフの作成

退会済みユーザー

退会済みユーザー

総合スコア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グッド

0クリップ

投稿2019/12/22 13:36

全国のイベント情報をまとめたデータフレーム【df_event】のイベント数を開催年の年代ごとにカウントして棒グラフで可視化したいと考えています。

【df_event】
|イベント名|都道府県名|都道府県ナンバー|費用(万円)|イベント計画(考案)|開催|
|:--|:--:|--:|
|〇〇祭り|北海道|0|780|1983/2/8|1985/4/11
|・|・|・|
|・|・|・|
|〇〇パーティー|東京都|11|428|2003/11/30|2007/1/22
|・|・|・|
|・|・|・|
|〇〇生誕祭|大阪府|26|227|1894/9/17|1896/10/2
|・|・|・|
|・|・|・|
|〇〇イベント|沖縄|46|356|1961/5/7|1963/3/14

何もいい方法が浮かばずつまずいている状態です。。
【イメージ画像】のように出力するのが目的です。。
どなたかご教授よろしくお願いいたします。。

【イメージ画像】
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

df_event が既にあるという前提で、次のようにしてはどうでしょう。

python

1df_event['datetime'] = pd.to_datetime(df_event['開催']) 2df_event['year'] = df_event['datetime'].dt.year 3years = list(range(1930, 2000, 10)) 4plt.hist(df_event['year'], bins=years, width=8) 5plt.xticks(years, ['{}~'.format(y) for y in years])

(以下、追記)
開催列を西暦に統一するサンプル。

python

1import re 2pattern = re.compile('昭和(\d+)年(\d+)月(\d+)日') 3def to_ad(d): 4 m = pattern.match(d) 5 if m: 6 return '{}/{}/{}'.format(1925 + int(m[1]), m[2], m[3]) 7 return d 8 9df_event['ad'] = df_event['開催'].map(to_ad)

投稿2019/12/22 14:12

編集2019/12/23 10:17
kit494way

総合スコア317

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

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

退会済みユーザー

退会済みユーザー

2019/12/22 14:45

ご回答ありがとうございます! 下記のエラーが起きるのですが、'開催'列に '昭和63年10月1日'が含まれているということでしょうか? ValueError: ('Unknown string format:', '昭和63年10月1日')
kit494way

2019/12/22 14:54

はい。そのようですね。 これだと事前に西暦表記に統一しないとダメですね。
kit494way

2019/12/22 15:23 編集

以下のように'開催'列を西暦表記に統一した列'ad'を生成して、ad に対して pd.to_datetime() を呼び出せばよいかと思います。 他にも異なる形式のデータがあれば、to_ad() 関数を適宜修正してください。 ``` import re pattern = re.compile('昭和(\d+)年(\d+)月(\d+)日') def to_ad(d): m = pattern.match(d): if m: return '{}/{}/{}'.format(1925 + int(m[1]), m[2], m[3]) return d df_event['ad'] = df_event['開催'].map(to_ad) ```
kit494way

2019/12/22 15:23

コメントに書いたコードがインデントされないので、回答の方に追記しました。
退会済みユーザー

退会済みユーザー

2019/12/23 10:05

def to_ad(d): m = pattern.match(d): で書くとインデントエラーが起き、 def to_ad(d):   m = pattern.match(d): で書くとシンタックスエラーが起きてしまいます。。
kit494way

2019/12/23 10:21

m = pattern.match(d): の末尾のコロンは不要です。 試したコードをそのままコピペしたつもりだったんですが、ミスってたようです。すみません。 回答の方を修正したのでそちらを参考にしてください。 Python はインデントが重要なので、コメントに書いてあるコードは無視してください。
退会済みユーザー

退会済みユーザー

2019/12/23 10:27

何度も申し訳ありません。 修正していただいたコードで打ち込むと下記エラーが発生します。。 TypeError: expected string or bytes-like object
kit494way

2019/12/23 11:41 編集

そのエラーは df_event['ad'] = df_event['開催'].map(to_ad) で発生するということですか? であれば、開催列に欠損値があるのではないでしょうか? 各列に欠損値がいくつあるかは df_event.isnull().sum() で確認できます。 欠損値をどうするのか(除外するのか、何かで補間するのか)は分析の目的に応じてご自身で決めて対処していただくしかないです。
guest

0

こんな感じでしょうか。

python

1import io 2import pandas as pd 3 4data = """ 5イベント名 都道府県名 都道府県ナンバー 費用(万円) イベント計画(考案) 開催 6〇〇祭り 北海道 0 780 1983/2/8 1985/4/11 7〇〇パーティー 東京都 11 428 2003/11/30 2007/1/22 8〇〇生誕祭 大阪府 26 227 1894/9/17 1896/10/2 9〇〇イベント 沖縄 46 356 1961/5/7 1963/3/14 10""" 11 12df = pd.read_csv(io.StringIO(data), sep="\s+", engine="python") 13df["開催"] = pd.to_datetime(df["開催"]) 14groups = df["開催"].groupby(by=df["開催"].dt.year//10*10).count() # 1桁目を切り捨ててgroupby 15print(groups) 16""" => 17開催 181890 1 191960 1 201980 1 212000 1 22Name: 開催, dtype: int64 23""" 24

投稿2019/12/22 13:49

hayataka2049

総合スコア30935

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

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

退会済みユーザー

退会済みユーザー

2019/12/22 14:43

ご回答ありがとうございます! data = """ 〜の部分には【df_event】の全データを打ち込むのでしょうか??
hayataka2049

2019/12/22 14:47 編集

そこは例示のためにこうしているだけで、実際のコードでは適宜改変していただいて結構です。読み込みが終わった後の部分を参考にしてください。年ごとに集計できるので、この後プロットしてください。
退会済みユーザー

退会済みユーザー

2019/12/23 09:53

すみません、なにぶんpython初学者なもので、ioモジュールを使ったことがなく、、 data = """ 〜"""の部分に何を打ち込めばいいかわからないです。。
hayataka2049

2019/12/23 12:00

このコードのdfの代わりにdf_eventを使えば良いのですね。覚えておくと良いかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問