Pandas read_csv dtypeはすべての列を読み取りますが、いくつかは文字列として読み取ります 質問する

Pandas read_csv dtypeはすべての列を読み取りますが、いくつかは文字列として読み取ります 質問する

私は Pandas を使用して多数の CSV を読み取っています。オプションの json を dtype パラメータに渡して、どの列をデフォルトではなく文字列として読み取るかを pandas に指示します。

dtype_dic= { 'service_id':str, 'end_date':str, ... }
feedArray = pd.read_csv(feedfile , dtype = dtype_dic)

私のシナリオでは、全ていくつかの特定の列を除いて、列は文字列として読み取られます。したがって、いくつかの列を str として定義するのではなくdtype_dic、選択したいくつかの列だけを int または float として設定したいと思います。それを行う方法はありますか?

これは、異なる列を持つさまざまな CSV を循環するループなので、csv 全体を文字列 ( dtype=str) として読み込んだ後、直接列を変換するのは簡単ではありません。csv にどの列があるかすぐにはわからないからです。(その労力を、dtype json ですべての列を定義することに費やしたいと思います!)

編集: ただし、その列がその CSV に存在しない場合にエラーを出さずに、数値に変換する列名のリストを処理する方法があれば、CSV 読み取り段階自体でこれを行う他の方法がない場合、それは有効な解決策になります。

注: これは以前に尋ねられた質問のようにしかし、そこでの回答は、この質問には当てはまらない、まったく異なる道筋(bool 関連)をたどりました。重複としてマークしないでください。

ベストアンサー1

Pandas 1.5.0以降では、これを行う簡単な方法があります。引数にdefaultdict通常のではなくを使用すると、辞書に明示的にリストされていない列は、その型としてデフォルトを使用します。例:dictdtype

from collections import defaultdict
types = defaultdict(str, A="int", B="float")
df = pd.read_csv("/path/to/file.csv", dtype=types, keep_default_na=False)

(私はこれをテストしていませんが、それでも必要だと思いますkeep_default_na=False)


Pandas の古いバージョンの場合:

次のように、csv 全体を文字列として読み取り、その後で必要な列を他の型に変換できます。

df = pd.read_csv('/path/to/file.csv', dtype=str, keep_default_na=False)
# example df; yours will be from pd.read_csv() above
df = pd.DataFrame({'A': ['1', '3', '5'], 'B': ['2', '4', '6'], 'C': ['x', 'y', 'z']})
types_dict = {'A': int, 'B': float}
for col, col_type in types_dict.items():
    df[col] = df[col].astype(col_type)

keep_default_na=False列の一部が空の文字列である場合や、NApandasがデフォルトでNA型に変換するようなものである場合は、 /floatの混合データ型になる必要がある。strfloat

別の方法として、ファイルを読み込むときにすべての列に適切な型を指定し、後で変更したくない場合は、列名のみ(行なし)を読み込み、それらを使用してどの列が文字列であるかを入力します。

col_names = pd.read_csv('file.csv', nrows=0).columns
types_dict = {'A': int, 'B': float}
types_dict.update({col: str for col in col_names if col not in types_dict})
pd.read_csv('file.csv', dtype=types_dict)

おすすめ記事