1. ホーム
  2. python

[解決済み] Pandas read_csv dtype は全てのカラムを読みますが、一部のカラムは文字列として読みます。

2023-08-10 03:02:58

質問

Pandasを使ってCSVを大量に読み込んでいます。dtypeパラメータにoptions jsonを渡して、どの列をデフォルトではなく文字列として読み込むかをpandasに教えています。

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

私のシナリオでは 全て の場合、いくつかの特定のカラムを除いて、カラムは文字列として読み込まれます。したがって、いくつかのカラムを dtype_dic でいくつかのカラムをstrとして定義する代わりに、私は選んだいくつかのカラムだけをintまたはfloatとして設定したいのです。それを行う方法はありますか?

異なるカラムを持つ様々なCSVを循環させるループなので、csv全体を文字列として読み込んだ後に直接カラムを変換する ( dtype=str として読み込んだ後、直接カラムを変換するのは簡単ではありません。(むしろ、dtype jsonですべてのカラムを定義することにその労力を費やしたい!)

編集:しかし、もしそのcsvにカラムが存在しない場合、エラーにならずに数値に変換するカラム名のリストを処理する方法があるのなら、csv読み込み段階自体でこれを行う他の方法がないのなら、それは有効な解決策になるでしょうね。

注意: この音は のように聞こえますが、これは以前に質問された のようですが、その回答はこの質問には当てはまらない非常に異なる道(ブールに関連する)を進んでいました。Plsは重複としてマークしないでください!

解決する方法は?

EDIT - すみません、私はあなたの質問を間違って読んでいました。私の答えを更新しました。

csv全体を文字列として読み込んで、後から必要な列を他の型に変換することは、このように可能です。

df = pd.read_csv('/path/to/file.csv', dtype=str)
# 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)

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

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)