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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

Q&A

解決済

1回答

1238閲覧

TypeError: string indices must be integers

Deep_passion

総合スコア45

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

1グッド

0クリップ

投稿2021/11/05 01:28

編集2021/11/05 05:00

前提・実現したいこと

列のどこかに、数字じゃなきゃいけないのに、文字列が入っています。。
それの、見つけ方をどなかた優秀なかたがいましたら、やり方を共有してもらえると幸いです。

イメージ説明

イメージ説明

1枚目だと、エラーがでないで、2枚目だと、エラーが出ない。

イメージ説明

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

traintraintrain--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-85-4a4de24907bb> in <module> 4 print(f'FOLD: {fold}') 5 print('-'*50) ----> 6 run(, fold) <ipython-input-82-b49272d4ce84> in run(data, fold) 2 args = Config() 3 model, model_config, tokenizer, optimizer, scheduler, train_dataloader, \ ----> 4 valid_dataloader, result_dict = init_training(args, data, fold) 5 6 trainer = Trainer(model, tokenizer, optimizer, scheduler) <ipython-input-81-d7f5e53d125d> in init_training(args, data, fold) 17 18 # data loaders ---> 19 _dataloader, valid_dataloader = make_loader(args, data, tokenizer, fold) 20 21 # optimizer <ipython-input-78-daed5db03d79> in make_loader(args, data, tokenizer, fold) 55 train_features, valid_features = [[] for _ in range(2)] 56 for i, row in train_set.iterrows(): ---> 57 _features += prepare_train_features(args, row, tokenizer) 58 for i, row in valid_set.iterrows(): 59 valid_features += prepare_train_features(args, row, tokenizer) <ipython-input-72-03ad6972eb22> in prepare_train_features(args, example, tokenizer) 35 answers = example["answers"] 36 ---> 37 if len(answers["answer_start"]) == 0: 38 feature["start_position"] = cls_index 39 feature["end_position"] = cls_index TypeError: string indices must be integers

該当のソースコード

train = pd.read_csv('../input/squad-ta-hi-190k/squad_ta_hi.csv',index_col = 0) train [](https://www.kaggle.com/rhtsingh/chaii-qa-5-fold-xlmroberta-torch-fit)

試したこと

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

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

Python3 (3.7.4)
Jupyter Lab version 1.1.4
macbookpro 16

teratailyuya👍を押しています

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

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

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

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

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

meg_

2021/11/05 04:28

> 1枚目だと、エラーがでないで、2枚目だと、エラーが出ない。 何が問題なのでしょうか?
Deep_passion

2021/11/05 04:46

データの型か、内容がおかしいと思うのですが、どうしたら、判断できますでしょうか?上がきれいなデータで、下がよくないデータです。
Deep_passion

2021/11/05 05:01

文字列の見つけ方かもしれないです。
melian

2021/11/05 05:09

answers が文字列だから、です。やはり前回の質問で提案した様に answers を辞書に変換しておくべきかと思います。
Deep_passion

2021/11/05 05:52

163524, 97989, 130756, 163527, 163531, 130764, 163536, 98002, 163539, 163541, 163542, 163544, 163545, 98011, 163548, 163551, 163555, 163557, 163559, 98025, 163562, 163563, 98026, 98027, 130797, 130798, 163569, 98037, 130806, 98040, 163580, 98045, 163582, 163583, 163584, 163585, 163586, 98047, 98050, 98053, 130817, 130819, 163592, 98060, 98061, 98062, 130828, 130834, 98067, 163605, 130840, 98073, 130842, 98075, 163612, 163613, 98078, 98079, 130845, 130847, 163618, 98084, 163621, 98085, 163623, 98087, 130857, 130858, 163627, 163628, 98092, 98096, 98097, 98099, 163637, 163638, 98102, 98104, 163641, 98106, 130869, 163644, 163645, 130877, 98111, 98112, 98113, 163650, 130878, 130881, 163653, 163656, 130890, 130891, 98124, 163662, 130896, 163666, 130898, 130900, 130901, 163672, 163674, 130907, 163677, 130909, 130910, 163680, 163681, 98147, 163684, 163685, 130915, 98151, 130917, 98153, 98157, 98158, 98160, 163699, 163700, 98163, 98164, 98167, 98169, 130939, 163708, 98174, 163713, 130947, 163718, 163719, 98183, 130950, 98186, 98189, 130959, 98192, 98193, 163735, 130972, 98205, 163742, 130975, 163747, 163748, 163750, 163751, 163752, 163754, 163755, 98218, 130988, 130989, 98224, 163763, 163764, 130995, 130998, 163768, 163770, 131004, 98240, 131010, 163779, 131011, 163781, 163783, 163784, 163785, 163786, 98249, 98250, 131016, 131017, 98255, 98256, 131018, 131020, 163795, 98260, 98261, 131022, 131024, 131028, 131032, 131033, 163803, 131035, 163807, 98277, 98278, 131045, 163819, 163820, 131052, 131058, 163827, 163828, 98291, 131060, 131065, 163834, 163835, 131068] not in index' ご返信ありがとうございます。 melianさんの言う通り、このようにしてみたところこうなってしまいました。
guest

回答1

0

ベストアンサー

エラーメッセージの以下の部分を見ると、answers["answer_start"] としているので、answers は辞書であることを想定している事が判ります。

35 answers = example["answers"] 36 ---> 37 if len(answers["answer_start"]) == 0: 38 feature["start_position"] = cls_index 39 feature["end_position"] = cls_index TypeError: string indices must be integers

そこで、前回の質問(テーブルデータに格納する方法)に戻って、以下の様にしてみてはどうでしょうか。

python

1import pandas as pd 2import json 3 4train_fa = pd.DataFrame({ 5 'answers': [ 6 "[{'text': 'text 01', 'answer_start': 1}]", 7 "[{'text': 'text 02', 'answer_start': 2}]", 8 "[{'text': 'text 03', 'answer_start': 3}]", 9 "[{'text': 'text 04', 'answer_start': 4}]", 10 "[{'text': 'text 05', 'answer_start': 5}]", 11 ], 12}) 13 14train_fa['answers_1'] = train_fa.answers.apply( 15 lambda x: json.loads( 16 x[1:-1].replace("'", '"'), 17 object_hook=lambda d: 18 {k: [v] for k, v in d.items()})) 19 20print(train_fa) 21# 22 answers answers_1 230 [{'text': 'text 01', 'answer_start': 1}] {'text': ['text 01'], 'answer_start': [1]} 241 [{'text': 'text 02', 'answer_start': 2}] {'text': ['text 02'], 'answer_start': [2]} 252 [{'text': 'text 03', 'answer_start': 3}] {'text': ['text 03'], 'answer_start': [3]} 263 [{'text': 'text 04', 'answer_start': 4}] {'text': ['text 04'], 'answer_start': [4]} 274 [{'text': 'text 05', 'answer_start': 5}] {'text': ['text 05'], 'answer_start': [5]} 28# 29 30print(type(train_fa.answers[0]), type(train_fa.answers_1[0])) 31# 32<class 'str'> <class 'dict'>

元は JSON 形式の文字列なので json.loads で辞書に変換するのですが、key-value の値の方はリストにする必要がある様に見えるので、リストにしています。

投稿2021/11/05 06:17

melian

総合スコア19865

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

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

Deep_passion

2021/11/05 06:45

素晴らしい回答ありがとございます。
Deep_passion

2021/11/05 07:04

本当に素晴らしい回答でした。クールすぎて、frozenしてしまいました。LOL
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問