前の質問に続きますが、列内の各オブジェクトの型を取得する効率的な方法はありますか? これは特にdtype
、列object
の が列の要素間で異種の型を許可する場合 (特に、NaN
他の要素のデータ型を に変更せずに数値を許可する場合) に当てはまりますfloat
。
私は時間のベンチマークを行っていませんが、頭に浮かぶ次のすぐに明白な方法 (およびmap
orを使用する可能性のあるバリアントfilter
) には懐疑的です。関心のあるユースケースでは、すべての要素の型に関する情報をすばやく取得する必要があるため、ジェネレーターなどはおそらくここでは効率化に役立ちません。
# df is a pandas DataFrame with some column 'A', such that
# df['A'].dtype is 'object'
dfrm['A'].apply(type) #Or np.dtype, but this will fail for native types.
もう 1 つの考えは、NumPyvectorize
関数を使用することでしたが、これは本当に効率的でしょうか? たとえば、上記と同じ設定で、次のことを試すことができます。
import numpy as np
vtype = np.vectorize(lambda x: type(x)) # Gives error without lambda
vtype(dfrm['A'])
どちらのアイデアも実行可能な出力につながりますが、私が心配しているのは効率です。
追加した
私は先に進み、IPython で小さなベンチマークを行いました。最初はvtype
上記、次にapply
ルートです。私はそれを十数回繰り返しましたが、この例の実行は私のマシンではかなり典型的です。
このapply()
アプローチは明らかに勝っていapply()
ます。
為にvtype()
In [49]: for ii in [100,1000,10000,100000,1000000,10000000]:
....: dfrm = pandas.DataFrame({'A':np.random.rand(ii)})
....: dfrm['A'] = dfrm['A'].astype(object)
....: dfrm['A'][0:-1:2] = None
....: st_time = time.time()
....: tmp = vtype(dfrm['A'])
....: ed_time = time.time()
....: print "%s:\t\t %s"%(ii, ed_time-st_time)
....:
100: 0.0351531505585
1000: 0.000324010848999
10000: 0.00209212303162
100000: 0.0224051475525
1000000: 0.211136102676
10000000: 2.2215731144
為にapply()
In [50]: for ii in [100,1000,10000,100000,1000000,10000000]:
....: dfrm = pandas.DataFrame({'A':np.random.rand(ii)})
....: dfrm['A'] = dfrm['A'].astype(object)
....: dfrm['A'][0:-1:2] = None
....: st_time = time.time()
....: tmp = dfrm['A'].apply(type)
....: ed_time = time.time()
....: print "%s:\t %s"%(ii, ed_time-st_time)
....:
100: 0.000900983810425
1000: 0.000159025192261
10000: 0.00117015838623
100000: 0.0111050605774
1000000: 0.103563070297
10000000: 1.03093600273