web-dev-qa-db-ja.com

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)

私のシナリオでは、allいくつかの特定の列を除く列は文字列として読み込まれます。したがって、dtype_dicで複数の列をstrとして定義する代わりに、選択した数列をintまたはfloatに設定したいと思います。それを行う方法はありますか?

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

編集:しかし、その列がcsvに存在しない場合、エラーなしで列名のリストを番号に変換する方法がある場合は、他の方法がない場合は有効な解決策になりますこれはcsv読み取り段階そのものです。

注:これは 以前に尋ねられた質問のように に聞こえますが、そこでの答えはこの質問には当てはまらない非常に異なるパス(ブール関連)に行きました。 Plsは重複としてマークしません!

20
Nikhil VJ

編集-申し訳ありませんが、あなたの質問を読み違えました。私の答えを更新しました。

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)
27
Nathan