2017-10-25 7 views
1

私はpandasデータフレームとしてインポートしているExcelファイルがあります。パンダの列のデータ型を確認してください

マイDF:

{ 'name' : 'str', 
    'value' : 'float64', 
    'id' : 'int64'} 

私はで定義されている私のデータフレームの列のデータ型が同じであるかどうかを確認したい:私は形式の辞書dを有する

id name value 
1  abc  22.3 
2  asd  11.9 
3  asw  2.4 

辞書。すべての列がそれぞれのデータ型を持っている場合

出力は

print("Success") 
else: 
    print(" column id has different data type.Please check your file)" 

答えて

2

コールdtypes、辞書に変換してから比較、などだけで文字列を指定できます。

d1 = df.dtypes.astype(str).to_dict() 

d1 
{'id': 'int64', 'name': 'object', 'value': 'float64'} 

d1 == {'name' : 'str', 'value' : 'float64', 'id' : 'int64'} 
False 

残念なことに、nameはないstrobjectカラム、したがってFalseであることが示されています。私は(これは傷つけるべきではありません)あなたのdict以上の迅速な反復処理を行うと、strobjectに表示されるすべてのエントリを変更することをお勧めできます。

d2 = {k : 'object' if v == 'str' else v for k, v in d2.items()} 

d2 
{'id': 'int64', 'name': 'object', 'value': 'float64'} 

d1 == d2 
True 

列(複数可)が間違っていたを確認するには、ソリューションはもう少し複雑になりますが、リストの理解ではまだ簡単です。

[k for k in d1 if d1[k] != d2.get(k)] 
['name'] 
+0

@COLDSPEEDはいstrはオブジェクトに変換されますが、この問題を処理する方法はありますか? .astype(str) – Shubham

+0

@SRingne残念ながら、私は考えることはできません。ナンシーは同じ大会に従い、パンダはそれに従ったようだ。データフレームのdtypeと比較する前に、手作業で 'dict'を取り出し、' str'をどこにでも 'object'に変換することをお勧めします。それは正しいことでしょうか? –

+1

@SRingne編集でそれを行う方法を教えてください。それがあなたのために十分であることを願っています。ありがたいことに、strをオブジェクトに変換することはうまくいくはずです。なぜなら、strは結局オブジェクトであるからです。リストの列もオブジェクト列(str列ではない)なので、オブジェクトをstrに変換することを恐れています。 –

1

使用

In [5759]: s = df.dtypes == pd.Series(d) 

In [5760]: ss = s[~s] 

In [5761]: if ss.empty: 
     ...:  print('sucess') 
     ...: else: 
     ...:  print ('columns %s have different data type' % ss.index.tolist()) 
     ...: 
     ...: 
columns ['name'] have different data type 

詳細

In [5763]: df 
Out[5763]: 
    id name value 
0 1 abc 22.3 
1 2 asd 11.9 
2 3 asw 2.4 

In [5764]: d 
Out[5764]: {'id': 'int64', 'name': 'str', 'value': 'float64'} 
+0

比較中に最初の手順でエラーが表示されます。 値エラー同一ラベルのシリーズオブジェクトのみを比較できます – Shubham

+0

dfにdがない場合、またはdがdfに存在しない列を含んでいる場合の動作はどのようにする必要がありますか? – Zero

0

あなたはstrに列の最初の値のtypeを変換してから比較することができます:

d1 = {x: type(df[x].iat[0]).__name__ for x in df.columns} 
print (d1) 
{'name': 'str', 'id': 'int64', 'value': 'float64'} 

print (d == d1) 
True 
関連する問題