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

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

ただいまの
回答率

88.06%

tweepyを使ってtwitterのトレンドを取得してpandasでエクセルファイルに書き出したいけど上手く取得できない。

受付中

回答 1

投稿

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 98

score 17

前提・実現したいこと

twitterで全国のトレンドをtwitterAPIに接続して取得してトレンドをエクセルファイルに書き出したいのですが上手くいきません
現在、tweepyを使ってトレンドを取得してpandasでエクセルで表示させようとしているのですが、下記のようなエラーメッセージがでてしまいます。
トレンドを取得してコマンドの出力結果には全国各地域の50番目までのトレンドを取得することができましたが、append( )関数をどのように記載すればいいか分からずエラーがでているような状況です。このappend( )関数をどのようにすればエクセルにtwitterのトレンドを取得できるのか、ぜひアドバイスいただきたいです。
もし、私のしようとしていることにpandasが不向きなら他の方法も教えていただきたいです。よろしくお願いします。

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "/Users/construction.py", line 568, in _list_to_arrays
    columns = _validate_or_indexify_columns(content, columns)
  File "/Users//construction.py", line 692, in _validate_or_indexify_columns
    raise AssertionError(
AssertionError: 9 columns passed, passed data had 2 columns

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users//twitterno.py", line 114, in <module>
    df = pd.DataFrame(tr_date, columns=colum)
  File "/Users/untitled3/venv/lib/python3.8/site-packages/pandas/core/frame.py", line 570, in __init__
    arrays, columns = to_arrays(data, columns, dtype=dtype)
  File "/Users//untitled3/venv/lib/python3.8/site-packages/pandas/core/internals/construction.py", line 528, in to_arrays
    return _list_to_arrays(data, columns, coerce_float=coerce_float, dtype=dtype)
  File "/Users/untitled3/venv/lib/python3.8/site-packages/pandas/core/internals/construction.py", line 571, in _list_to_arrays
    raise ValueError(e) from e
ValueError: 9 columns passed, passed data had 2 columns

該当のソースコード

import tweepy
import pandas as pd

CONSUMER_KEY = "my CONSUMER_KEY"
CONSUMER_SECRET = "my CONSUMER_SECRET"
ACCESS_TOKEN = "my ACCESS_TOKEN"
ACCESS_SECRET = "my ACCESS_SECRET"

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth, wait_on_rate_limit=True)

colum = ["日本", "札幌", "仙台", "東京", "京都", "大阪", "広島", "福岡", "沖縄"]

places ={
    "日本": 23424856,
    "札幌": 1118108, "仙台": 1118129,
    "東京": 1118370, "京都": 15015372, "大阪": 15015370,
    "広島": 1117227, "福岡": 1117099, "沖縄": 2345896
}

for area, place in places.items():
    print("--{}--".format(area))

    treands = api.trends_place(place)[0]

    for i, content in enumerate(treands["trends"]):
        tr_date = []
        a = (i + 1, content['name'])
        tr_date.append(a)
        df = pd.DataFrame(tr_date, columns=colum)
        df.to_excel('t_trend.xlsx', sheet_name="Sheet1")
    print("------------------")

試したこと

下記のfor文の部分でappend()関数を使わずに、

print(i + 1, content['name'])


とするとトレンドは取得できているのが出力結果から分かりました。

    for i, content in enumerate(treands["trends"]):
        tr_date = []
        print(i + 1, content['name'])#ここでトレンドは取得できているようです。
        df = pd.DataFrame(tr_date, columns=colum)
        df.to_excel('t_trend.xlsx', sheet_name="Sheet1")
    print("------------------")

補足情報(FW/ツールのバージョンなど)

python3.8 PyCharm

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

エラーが発生しているのは、この行です。

df = pd.DataFrame(tr_date, columns=colum)

で、エラーの内容は次のとおりです。

ValueError: 9 columns passed, passed data had 2 columns


列名は9列で指定されたけど、渡されたデータは2列しかないよ!ということです。

それはその通りで、appendメソッドは与えられた要素を分解せずに、配列の最後の要素とするものです。
これに従って、tr_data[(i + 1, content['name'])]という1行2列の配列(厳密には違いますが)になっているため、上述のエラーが出たと考えられます。

Dataframeで取得したデータであれば、Dataframeのまま加工した方がいいかと思います。
詳細な方法はまた調べてみて、うまくいかなければ再度質問してください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/04/30 21:16

    ご回答ありがとうございます。エラーの内容教えていただきありがとうございます。
    現在いろいろ試行錯誤し取得データを9つに分けて取り出そうしているのですが上手くいかずenumerate()は使うべきではないでしょうか?
    この部分を
    a = (i + 1, content['name'])

    a = (i + 1, content['name'], 〇, 〇, 〇, 〇, 〇, 〇, 〇,)
    このようなイメージで分けるといいことでしょうか??

    キャンセル

  • 2021/04/30 21:23

    tr_date = []
    df = pd.DataFrame(i + 1, content['name'], columns=colum)
    tr_date.append(df)

    このようなイメージかなと思いましたがだめでした。

    キャンセル

  • 2021/05/04 21:40 編集

    https://note.nkmk.me/python-pandas-merge-join をを参考にしてみてください。

    キャンセル

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

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

関連した質問

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

  • トップ
  • Pythonに関する質問
  • tweepyを使ってtwitterのトレンドを取得してpandasでエクセルファイルに書き出したいけど上手く取得できない。