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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

17591閲覧

[Python] TypeError: '>=' not supported between instances of 'str' and 'int'

soccergirl8

総合スコア4

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/06/15 22:49

編集2021/06/17 13:38

前提・実現したいこと

ソースコード②ではエラーは発生せず正しく実行されるのに対し、①では下記エラーが発生してしまいます。ソースコード①、②では順番を入れ替えたのみで'str'や'int'によるデータ型の変換は行っていないのに、何故でしょうか。

エラーメッセージ

TypeError: '>=' not supported between instances of 'str' and 'int'

ソースコード①

Python

1import pandas as pd 2df=pd.read_csv("test.csv") 3 4df["美術"]=["68","73","82","77","94","96"] 5df.loc[6]=["G恵","90","92","94","96","92","98"] 6 7data_s=df[df["国語"]>=90] 8print("国語の点数が90点以上\n", data_s) 9 10data_c=df[df["数学"]<70] 11print("数学の点数が70点未満\n",data_c)

ソースコード②

Python

1import pandas as pd 2df=pd.read_csv("test.csv") 3 4data_s=df[df["国語"]>=90] 5print("国語の点数が90点以上\n", data_s) 6 7data_c=df[df["数学"]<70] 8print("数学の点数が70点未満\n",data_c) 9 10df["美術"]=["68","73","82","77","94","96"] 11df.loc[6]=["G恵","90","92","94","96","92","98"]

test.csvの中身

名前 国語 数学 英語 理科 社会
0 A太 83 89 76 97 76
1 B介 66 93 75 88 76
2 C子 100 84 96 82 94
3 D郎 60 73 63 52 70
4 E美 92 62 84 80 78
5 F菜 96 92 94 92 90

試したこと

ソースコード①で

data_s=df[df[int("国語")]>=90]とすると
invalid literal for int() with base 10: '国語'

data_s=df[int(df["国語"])>=90]とすると
TypeError: cannot convert the series to <class 'int'>

のエラーが発生します。

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

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

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

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

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

jbpb0

2021/06/16 00:52

質問内容とずれるかもしれませんが、科目が5つなのに、数値が6つあるのは、なぜでしょうか? と思って、再度質問を見直したら、test.csvの一番右の数値は美術ですかね? 科目名「美術」は無いのに、数値だけはある?
soccergirl8

2021/06/17 13:37

そうです、、すみません消し忘れなので修正しました。
guest

回答2

0

ベストアンサー

一般にコンピュータ言語では表現が同じであることは表現されているデータが同じであることを示していません。Pythonでもそうです。

以下を見て理解してください。

Python

1>>> i_42 = 42 2>>> print(i_42) 342 4>>> s_42 = "42" 5>>> print(s_42) 642 7>>> l_spam = ["spam", "spam", "spam"] 8>>> print(l_spam) 9['spam', 'spam', 'spam'] 10>>> s_spam = "['spam', 'spam', 'spam']" 11>>> print(s_spam) 12['spam', 'spam', 'spam']

一見同じように見えるものでも型は違っています。

Python

1>>> print(type(i_42)) 2<class 'int'> 3>>> print(type(s_42)) 4<class 'str'> 5>>> print(type(l_spam)) 6<class 'list'> 7>>> print(type(s_spam)) 8<class 'str'>

Pythonの場合は、1 + 41 という式は書けますが、1 + "41"という式は書けません。
1 < 42 はTrueですが、1 < "42" はエラーになります。他のプログラミング言語の中にはこれらが全て動く言語(例えばPerl)もあります。

Python

1>>> print(1 + 41) 242 3>>> print(1 + "41") 4Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6TypeError: unsupported operand type(s) for +: 'int' and 'str' 7>>> print(1 < 42) 8True 9>>> print(1 < "42") 10Traceback (most recent call last): 11 File "<stdin>", line 1, in <module> 12TypeError: '<' not supported between instances of 'int' and 'str'

これらを理解することで、何が問題なのかがわかってくるでしょう。

投稿2021/06/16 05:16

ppaul

総合スコア24666

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

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

soccergirl8

2021/06/17 13:59

元々のtest.csvではdf["国語"]はint64なのに、そこに df["美術"]=["68","73","82","77","94","96"] df.loc[6]=["G恵","90","92","94","96","92","98"] を行って国語の6行目に"90"の文字列を足してしまったために、df["国語"]がobjectになってしまい演算ができなくなったということですね。 数字から""を削除することで解決しました。ありがとうございます!
guest

0

実際に、df["国語"]のナカミを見てみればどうですか

投稿2021/06/15 22:54

y_waiwai

総合スコア87774

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

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

soccergirl8

2021/06/15 23:02

0 83 1 66 2 100 3 60 4 92 5 96 6 90 Name: 国語, dtype: object と表示されました。
jbpb0

2021/06/16 01:13 編集

> データ型の変換は行っていない 質問者さん print(df["国語"]) df.loc[6]=["G恵","90","92","94","96","92","98"] print(df["国語"]) とやって、「Name: 国語, dtype: object」の最後の「object」の部分がそれぞれどうか、確認してみてください
jbpb0

2021/06/16 01:11

ついでに言うと、下記も変えないと、美術の数値で何かしようとしたら、同じことが起きます df["美術"]=["68","73","82","77","94","96"]
y_waiwai

2021/06/16 01:12

まさにそのobjectと数値間では>=演算はサポートされてないってエラーですよ そこで何をしたい(してるつもり)のかよく考えてみよう
soccergirl8

2021/06/17 13:59

なるほど!元々のtest.csvではdf["国語"]はint64なのに、そこに df["美術"]=["68","73","82","77","94","96"] df.loc[6]=["G恵","90","92","94","96","92","98"] を行って国語の6行目に"90"の文字列を足してしまったために、df["国語"]がobjectになってしまい演算ができなくなったということですね。 数字から""を削除することで解決しました。ありがとうございます!
soccergirl8

2021/06/17 14:03

ちなみに、 data_s=df[df[int("国語")]>=90]とすると invalid literal for int() with base 10: '国語' data_s=df[int(df["国語"])>=90]とすると TypeError: cannot convert the series to <class 'int'> となってしまいデータ型を数値に戻すことができなかったのは何故でしょうか。1つ目は"国語"という文字列を数値に変換しようとしているためにエラーが起き、2つ目はdf["国語"]にはName: 国語, dtype: objectなど数値以外のデータも含まれているためにエラーが起きたのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問