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

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

ただいまの
回答率

87.61%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,566
退会済みユーザー

退会済みユーザー

全国のイベント情報をまとめたデータフレーム【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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

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)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/23 19:21

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

    キャンセル

  • 2019/12/23 19:27

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

    キャンセル

  • 2019/12/23 20:40 編集

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

    キャンセル

+1

こんな感じでしょうか。

import io
import pandas as pd

data = """
イベント名    都道府県名    都道府県ナンバー    費用(万円)    イベント計画(考案)    開催
〇〇祭り    北海道    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
"""

df = pd.read_csv(io.StringIO(data), sep="\s+", engine="python")
df["開催"] = pd.to_datetime(df["開催"])
groups = df["開催"].groupby(by=df["開催"].dt.year//10*10).count()  # 1桁目を切り捨ててgroupby
print(groups)
""" =>
開催
1890    1
1960    1
1980    1
2000    1
Name: 開催, dtype: int64
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/22 23:43

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

    キャンセル

  • 2019/12/22 23:47 編集

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

    キャンセル

  • 2019/12/23 18:53

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

    キャンセル

  • 2019/12/23 21:00

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

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る