2016-05-29 8 views
3

私はCSVファイルを持っています。その大半は文字列として読みたい値ですが、指定したタイトルの列が存在する場合は、boolとして列を読みたいと思います。パンダread_csv dtype 1以外のすべての列を指定

CSVファイルにはたくさんの列があるので、直接各列にデータ型を指定して、このような何かを与える:

data = read_csv('sample.csv', dtype={'A': str, 'B': str, ..., 'X': bool}) 

が、それは同時に、文字列の各列のタイプが、1つを定義し、ブール値としてオプションの列を読み込むことは可能ですか?

私の現在のソリューションは、以下の(しかし、それは非常にunefficientと遅いです)です:

data = read_csv('sample.csv', dtype=str) # reads all column as string 
if 'X' in data.columns: 
    l = lambda row: True if row['X'] == 'True' else False if row['X'] == 'False' else None 
    data['X'] = data.apply(l, axis=1) 

UPDATE: サンプルCSV:

'X' の列なし
A;B;C;X 
a1;b1;c1;True 
a2;b2;c2;False 
a3;b3;c3;True 

、または同じ缶BA (列がオプションなので):

A;B;C 
a1;b1;c1 
a2;b2;c2 
a3;b3;c3 

答えて

2

最初に列01をフィルタリングできますboolean indexingと値X、その後replace

cols = df.columns[df.columns.str.contains('X')] 
df[cols] = df[cols].replace({'True': True, 'False': False}) 

または必要性フィルターカラムX場合:

cols = df.columns[df.columns == 'X'] 
df[cols] = df[cols].replace({'True': True, 'False': False}) 

サンプル:なぜN

import pandas as pd 

df = pd.DataFrame({'A':['a1','a2','a3'], 
        'B':['b1','b2','b3'], 
        'C':['c1','c2','c3'], 
        'X':['True','False','True']}) 

print (df) 
    A B C  X 
0 a1 b1 c1 True 
1 a2 b2 c2 False 
2 a3 b3 c3 True 
print (df.dtypes) 
A object 
B object 
C object 
X object 
dtype: object 

cols = df.columns[df.columns.str.contains('X')] 
print (cols) 

Index(['X'], dtype='object') 

df[cols] = df[cols].replace({'True': True, 'False': False}) 

print (df.dtypes) 
A object 
B object 
C object 
X  bool 
dtype: object 
print (df) 

    A B C  X 
0 a1 b1 c1 True 
1 a2 b2 c2 False 
2 a3 b3 c3 True 
+0

ありがとうございます!私のソリューションよりもはるかに高速です! – user1802693

+0

その解決には非常に大きな問題があります.False値をTrue値に設定します。長さがゼロでない文字列はTrueとして解析されます。 – user1802693

+1

あなたは絶対に正しいので、回答を編集します。 – jezrael

1

使用するbool()データ型。 bool()は、(バージョン0.17でテスト)パンダからread_csvを使用する際に実際に何か特別な処理を必要としないパラメータが渡されたパラメータがFalseでない場合「」、なし、trueと評価されていない、または0

if 'X' in data.columns: 
    try: 
     l = bool(data.columns['X'].replace('False', 0)) 
    except: 
     l = None 
    data['X'] = data.apply(l, axis=1) 
+0

ラムダ式を適用すると処理時間が遅くなると思います。 – user1802693

+1

はい、間違いありません。もし私が元々やったようにそれに近づけるつもりなら、if/elseステートメントを使います。 'data == 'False':l = False'' elif data == 'True':l = True'' else:l = None'しかし、私は提供された回答を使用します。あなたが大きなデータセットを持っているとすれば、私は両方のソリューションに時間を掛け、最も速く使用します。幸運 – TheLazyScripter

1

。サンプルファイルをXで使用する:

import pandas as pd 

df = pd.read_csv("file.csv", delimiter=";") 
print(df.dtypes) 

A object 
B object 
C object 
X  bool 
dtype: object 
+0

私はデフォルトでそれを必要としませんが、私のデータは非常に特殊です(英数字の数字が混在しています)。これは、特殊な数値を文字列形式で保持するために、いくつかの列にこのような制限がある理由の1つです。 – user1802693

関連する問題