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

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

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

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

Q&A

解決済

2回答

507閲覧

python:seriesのインデックスを指定して値を参照した際のエラーについて

mlsyu

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/12/08 05:17

お世話になります。Pythonのプログラムで質問です。
Kaggleのタイタニックのデータで、下記を実行するとエラーになったりならなかったりします。

import pandas as pd

df = pd.read_csv('data/train.csv')
vc = df.dtypes.value_counts()
print(vc)
print(type(vc))
print(vc['int64'])#エラーの場合はここで発生


エラーが発生する場合、エラーメッセージは、
KeyError: 'int64'

エラーが発生しない場合、下記の様に出力されます。
int64 5
object 5
float64 2
dtype: int64
<class 'pandas.core.series.Series'>
5

実行ボタンを押すタイミングでエラーになったりならなかったりする理由をご存知の方がいらっしゃいましたらご教示願います。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

vcのインデックスが、文字列ではないからと思われます。
print で int64 と表示されていますが、'int64' ではなくて、numpy.dtype('int64') になっているはずです。
print(type(vc.index[0])) してみたらわかるでしょう。

単純な解決策としてはインデックスを文字列に変換してしまうのが簡単だと思います。

python

1import pandas as pd 2 3df = pd.read_csv('data/train.csv') 4vc = df.dtypes.value_counts() 5vc.index = vc.index.astype('str') # これを追加 6print(vc) 7print(type(vc)) 8print(vc['int64'])

エラーが起きたり、起きなかったりというのは原因はよくわからないですね。
numpy.dtype('int64') == 'int64'(dtypeと文字列の比較)はTrueなので、
エラーは発生しないような気もしますが、pandasの中の実装によるんじゃないでしょうか。

投稿2021/12/09 02:40

bsdfan

総合スコア4794

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

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

mlsyu

2021/12/09 03:14

ご返信ありがとうございます。 記載いただいたコードを追加したところ、何度実行してもエラーは表示されなくなりました! 私自身、型の理解ができておりませんでした、勉強になりました。 なお、元のコードの状態で、下記を出力してみたところ、 print(vc.index[0], type(vc.index[0])) エラーが出る出ないに関わらず、 int64 <class 'numpy.dtype[int64]'> と表示されました。 この点はよくわかりませんが、頂いたコードで本来やりたいことができるようになりましたので、大変助かりました。 ありがとうございました。
guest

0

エラーの前のprintはどのようになっていますでしょうか。
エラーにならなかったりするのはわからないですが、pd.read_csvdtypeを指定したらいかがでしょうか。

dtypeType name or dict of column -> type, optional

Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’} Use str or object together with suitable na_values settings to preserve and not interpret dtype. If converters are specified, they will be applied INSTEAD of dtype conversion.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html?highlight=read_csv#pandas.read_csv


コメントありがとうございます。
追記です。

エラーが発生する場合もprintは同じなのですね。

実行ボタンを押すタイミングでエラーになったりならなかったりする理由をご存知の方がいらっしゃいましたらご教示願います。

.

low_memory : bool, default True
(機械翻訳)
内部的にファイルをチャンク単位で処理するため、解析時のメモリ使用量は少なくなりますが、型の推論が混在する可能性があります。型が混在しないようにするには、False を設定するか、dtype パラメータで型を指定します。chunksize または iterator パラメータを使用して、データをチャンクで返すことができます。(Cパーサーでのみ有効)。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html?highlight=read_csv#pandas.read_csv

負荷が大丈夫かどうかという問題はありそうですが、
low_memory=False
にしたら毎回同じ状況にはなりますでしょうか。

投稿2021/12/08 08:39

編集2021/12/09 02:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mlsyu

2021/12/09 01:08

ご返信ありがとうございます。 printの出力全体は下記の通りです。(ユーザーIDは変更しています。) ----- int64 5 object 5 float64 2 dtype: int64 <class 'pandas.core.series.Series'> Traceback (most recent call last): File "C:\Users\xxxxx\Documents\python\01project\kaggle\lib\site-packages\pandas\core\indexes\base.py", line 3361, in get_loc return self._engine.get_loc(casted_key) File "pandas\_libs\index.pyx", line 76, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\index.pyx", line 108, in pandas._libs.index.IndexEngine.get_loc File "pandas\_libs\hashtable_class_helper.pxi", line 5198, in pandas._libs.hashtable.PyObjectHashTable.get_item File "pandas\_libs\hashtable_class_helper.pxi", line 5206, in pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'int64' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "c:\Users\xxxxx\Documents\python\01project\kaggle\titanic\b.py", line 7, in <module> print(vc['int64']) File "C:\Users\xxxxx\Documents\python\01project\kaggle\lib\site-packages\pandas\core\series.py", line 942, in __getitem__ return self._get_value(key) File "C:\Users\xxxxx\Documents\python\01project\kaggle\lib\site-packages\pandas\core\series.py", line 1051, in _get_value loc = self.index.get_loc(label) File "C:\Users\xxxxx\Documents\python\01project\kaggle\lib\site-packages\pandas\core\indexes\base.py", line 3363, in get_loc raise KeyError(key) from err KeyError: 'int64' また、dtype指定ですが、例えばpd.read_csvでdtype='object'として全ての項目をobject型として読み込み、 print(vc['object']) とすると、12と出力されることもありますし、KeyError:'object'となるときもあります。 (このコードは、読み込んだデータフレームに、どんな型が何個あるのかを知りたいというのが目的でした。)
mlsyu

2021/12/09 03:04

ご返信ありがとうございます。 low_memory=Falseとしてみましたが、状況は変わらず、エラーになったりならなかったりしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問