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

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

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

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

pandas

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

Q&A

解決済

1回答

3204閲覧

DataFrameから欲しいカラムをFor文で抜き出して別のデータフレームに保存したい

Chileno

総合スコア7

Python

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

pandas

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

0グッド

0クリップ

投稿2020/06/14 01:11

前提・実現したいこと

MacでPython3.XにてPandasを使用しています。
DataFrameからカラムを指定してデータを抽出して別のDataFrameにAppendして保存したいです。
アドバイスいただけますと幸いです。

###詳細
機械学習ではなく通常の処理でデータの分類をしようとしています。
教師データにあたるデータセットから、カテゴリー名、取引先名、明細を抜き出し、
明細をMeCabで分析をかけた後名詞だけ取り出し、それぞれをDataFrameの要素として以下の様に保存しています。
例1)カテゴリー名|取引先名 | 名詞1 | 名詞2 | 名詞3 | 名詞N
野菜     八百屋   イチゴ    3     個
魚      魚屋    新鮮    さんま    4     匹

このDataFrameをカテゴリー名がわからないデータに当てはめてカテゴリー名を振っていこうと考えています。
その下準備として、上記データを以下の様にまとめようとしています。
例2)カテゴリー名|取引先名| キーワード
野菜     八百屋   イチゴ
野菜     八百屋   3
野菜     八百屋   個
魚      魚屋    新鮮 ・・・

まずカテゴリー名と取引先名を取り出して名詞はfor文で拾って別のDataFrameでまとめようとしたところエラーが発生しています。

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

IndexError: single positional indexer is out-of-bounds

該当のソースコード

cat_list1 = pd.DataFrame() ##新しいDataFrameを先に宣言
for i in range(len(tdata)): ##tdataはDataFrameで元データ
for j in range(3,11):  ##名詞部分にあたるのが3〜11
add = tdata.iloc[i,0:2] ## ←ここにエラーがあるそう。カテゴリー名と取引先名をまず保存しようとしています。
add["キーワード"] = tdata.iloc[i,j] ##次にキーワードという列を作りたいと考えています。
cat_list1.append(add, ignore_index = True) ##キーワードに名詞を順番保存していこうと考えています。
i +=1

試したこと

ilocをlocにして見たり、for文で回す前に個別にエラーが発生しないか検証して見ました。

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

Python 3.7
Pandas

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの内容から添字iがデータフレームtdataの行の範囲を超えていることが原因です。最後の行にある i += 1 を削除して下さい。range()を使ったfor分ではiのインクリメントは不要です。

またDataFrameに対してappendを繰り返すのは効率が悪いので、リストを作ってから、新たにフレームを作る方法のが速度的な面で優位です。以下にサンプルコードを示します。

python

1# 最初にリストに詰める 2categories = [] 3sellers = [] 4keywords = [] 5for _, row in tdata.iterrows(): 6 for keyword in row.iloc[2:]: 7 if len(keyword) > 0: # キーワードがない場合は処理しない 8 categories.append(row["カテゴリー名"]) 9 sellers.append(row["取引先名"]) 10 keywords.append(keyword) 11 12# リストを元にDataFrameを作成 13cat_list1 = pd.DataFrame( 14 {"カテゴリー名": categories, "取引先名": sellers, "キーワード": keywords} 15)

投稿2020/06/14 02:04

yymmt

総合スコア1615

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

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

Chileno

2020/06/14 03:16

早速のご回答と改善案をありがとうございました。サンプルコードもいただきまして助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問