web-dev-qa-db-ja.com

Pandas csv-import:列の先頭のゼロを保持する

read_csvを使用して、Pandas=データフレームにスタディデータをインポートしています。

私のサブジェクトコードは、特に誕生日の6桁のコードです。一部の被験者では、これにより、先頭にゼロが付いたコードが生成されます(例: "010816")。

Pandasにインポートすると、先頭のゼロが取り除かれ、列はint64としてフォーマットされます。

この列を変更せずに文字列としてインポートする方法はありますか?

列にカスタムコンバーターを使用しようとしましたが、機能しません。Pandasがintに変換される前にカスタム変換が行われるようです。

38
user1802883

この質問/回答 by Lev Landa に示されているように、read_csvの特定の列にconvertersオプションを使用する簡単な解決策があります。関数。

converters={'column_name': lambda x: str(x)}

Pandas.io.parsers.read_csv documentationread_csv機能のオプションを参照できます。

以下のようなcsvファイルprojects.csvがあるとしましょう:

project_name,project_id
Some Project,000245
Another Project,000478

以下の例では、コードは先行ゼロをトリミングしています。

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv')
print dataframe

結果:

me@ubuntu:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
me@ubuntu:~$

ソリューションコードの例:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe

必要な結果:

me@ubuntu:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
me@ubuntu:~$
36
baltasvejas

短く、堅牢で完全に機能するソリューションを次に示します。

変数名と目的のデータ型の間のマッピング(辞書)を定義するだけです。

_dtype_dic= {'subject_id': str, 
            'subject_number' : 'float'}
_

pd.read_csv()でそのマッピングを使用します:

_df = pd.read_csv(yourdata, dtype = dtype_dic)
_

出来上がり!

16

多数の列があり、どの列に欠落している可能性のある先行ゼロが含まれているかわからない場合、またはコードを自動化する必要がある場合があります。次のことができます。

df = pd.read_csv("your_file.csv", nrows=1) # Just take the first row to extract the columns' names
col_str_dic = {column:str for column in list(df)}
df = pd.read_csv("your_file.csv", dtype=col_str_dic) # Now you can read the compete file

次のこともできます。

df = pd.read_csv("your_file.csv", dtype=str)

これにより、すべての列が文字列として取得され、先行ゼロが失われることはありません。

7
Erick Rodriguez

あなたが望むように列タイプを指定できるとは思わない(変更が頻繁に行われておらず、6桁の数値がdatetimeに変換できる日付でない場合)。 np.genfromtxt()を使用して、そこからDataFrameを作成してみてください。

編集:Wes Mckinneyの blog をご覧ください。何か役に立つかもしれません。 pandas 0.10の新しいパーサーが11月に登場するようです。

0
root

幅がわかっている場合は、convertersを使用して数値を固定幅に変換できます。

たとえば、幅が5の場合、

data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})

これでうまくいきます。 pandas == 0.23.0およびread_Excel

Python3.6以降が必要です。

0
secsilm