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

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

新規登録して質問してみよう
ただいま回答率
85.44%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

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

pandas

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

Q&A

1回答

1950閲覧

tweepyで取得したtwitterトレンドをpandasでエクセルファイルに書き出したいけど上手く整形して表示させれない

sakanaku

総合スコア17

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/05/09 12:24

編集2021/05/09 12:34

前提

twitterで全国のトレンドをtwitterAPIに接続して取得してトレンドをエクセルファイルに書き出したいのですが上手くいきません。
tweepyを使ってTwitterのトレンドを取得してpandasでエクセルで表示させようとしています。
コマンドの出力結果には全国各地域の50番目までのトレンドを取得することができました。
そして、全国のトレンド150位をエクセルに書き出したのですが、カラムCの1行にすべてのトレンドが1450番までという形で取得してしまいます。
エクセルシートのカラムAにはインデックス番号、カラムBにはトレンド順位、カラムCにはトレンド名が入ってます。
エクセルファイルでは下記のような形で書き出されています。
↓↓↓

カラムA カラムB カラムC カラムD...
0 1 トレンド1
1 2 トレンド2
2 3 トレンド3
3 4 トレンド4
. . .
. . .
. . .
450 50 トレンド450

実現したいこと

カラムBはしっかり50位まで取得したら次はどこかの地域の1位を取得しているようで「1」から表示されています。こちら50位まで取得したら、次はカラムDに1〜50位、カラムEに1〜50位と1行に50位ずつにしたいのですが、これはpandasですることは可能でしょうか??ぜひアドバイスいただきたいです。よろしくお願いします。

例えば下記のようにできたらと思っています。

A カラムB カラムC カラムD...
0 1 トレンド1 トレンド1. . . .
1 2 トレンド2 トレンド2 . . . .
2 3 トレンド3 トレンド3. . . .
3 4 トレンド4 トレンド4. . . .
. . . .
50 50 トレンド50 トレンド50 トレンド50. . . .

分かりにくかったら申し訳ありません。
エラーメッセージは特にありません。コマンドには全国各地域1〜50位まで取得して表示できています。

該当のソースコード

import tweepy import pandas as pd import datetime CONSUMER_KEY = "キー" CONSUMER_SECRET = "シークレット" ACCESS_TOKEN = "トークン" 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 } tr_date = [] for area, place in places.items(): # print("--{}--".format(area)) # リストになっているので取り出す treands = api.trends_place(place)[0] for i, content in enumerate(treands["trends"]): a = i + 1, content['name'] tr_date.append(a) df = pd.DataFrame(tr_date) df.to_excel('sample.xlsx', sheet_name="Sheet1")

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

python3.8 PyCharm

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

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

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

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

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

guest

回答1

0

データの形式が良くわかりませんので、例を示します。
これを参考にしてやってみてください。

python

1>>> import pandas as pd 2>>> rank = 5 3>>> area = 3 4>>> a = list(range(rank*area)) 5>>> b = [j for _ in range(area) for j in range(1, rank+1)] 6>>> c = [f'トレンド_{i}_{j}' for i in range(1,area+1) for j in range(1,rank+1)] 7>>> df = pd.DataFrame({"カラムA":a, "カラムB":b, "カラムC":c}) 8>>> print(df) 9 カラムA カラムB カラムC 100 0 1 トレンド_1_1 111 1 2 トレンド_1_2 122 2 3 トレンド_1_3 133 3 4 トレンド_1_4 144 4 5 トレンド_1_5 155 5 1 トレンド_2_1 166 6 2 トレンド_2_2 177 7 3 トレンド_2_3 188 8 4 トレンド_2_4 199 9 5 トレンド_2_5 2010 10 1 トレンド_3_1 2111 11 2 トレンド_3_2 2212 12 3 トレンド_3_3 2313 13 4 トレンド_3_4 2414 14 5 トレンド_3_5 25>>> df['area_id'] = df["カラムA"]//rank 26>>> df['ranks'] = df["カラムA"]%rank + 1 27>>> new_df = df.pivot(index='ranks', columns='area_id', values="カラムC").reset_index() 28>>> print(new_df) 29area_id ranks 0 1 2 300 1 トレンド_1_1 トレンド_2_1 トレンド_3_1 311 2 トレンド_1_2 トレンド_2_2 トレンド_3_2 322 3 トレンド_1_3 トレンド_2_3 トレンド_3_3 333 4 トレンド_1_4 トレンド_2_4 トレンド_3_4 344 5 トレンド_1_5 トレンド_2_5 トレンド_3_5

投稿2021/05/09 17:22

ppaul

総合スコア24666

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

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

sakanaku

2021/05/10 12:55

ご回答ありがとうございます。 丁寧に教えていただきありがとうございます。 現在、コードに for area, place in places.items(): treands = api.trends_place(place)[0] for i, content in enumerate(treands["trends"]): a = i + 1, content['name'] tr_date.append(a) b = [j for _ in range(1, a + 1) for j in range(1, colum + 1)]←こちらを追加 bの変数を追加させていただいたのですが、 TypeError: can only concatenate tuple (not "int") to tuple タイプエラーがでてきてタプルとintを結合しようとしているというエラーと思うのですが、タプルとは今回の場合どれをさすのでしょう?? データ形式というのはスクレイピングデータの取得されている形式のことでしょうか?辞書型で取得されているとさらにリストでも取得されているように思います。下記のような形が450?あります。 {'trends': [{'name': '#メイドの日', 'url': 'URL', 'promoted_content': None, 'query': 'パス?', 'tweet_volume': 数字},
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問