私は 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
通常のではなくを使用すると、辞書に明示的にリストされていない列は、その型としてデフォルトを使用します。例:dict
dtype
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
列の一部が空の文字列である場合や、NA
pandasがデフォルトでNA
型に変換するようなものである場合は、 /float
の混合データ型になる必要がある。str
float
別の方法として、ファイルを読み込むときにすべての列に適切な型を指定し、後で変更したくない場合は、列名のみ(行なし)を読み込み、それらを使用してどの列が文字列であるかを入力します。
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)