これは、データ フレーム A の特定の要素を、B を介してデコードされた値に応じて NaN に設定する必要があるデータ クリーニングの演習です。
3 ネストされたループが 17 時間実行される次のコードを作成しました。
def Convert(input):
X = np.fromstring(input[1:-1], dtype=np.int, sep=',')
return X
tf = B
# B is a dataframe of descriptors for the A dataframe
# the column 'missing_or_unknown' in B is used to determine the elements of A to be replaced
tf['missing_or_unknown'] = B['missing_or_unknown'].apply(lambda x: Convert(x))
Y = tf['missing_or_unknown'].values
for i in range(0,len(A)):
for j in range(0,85):
for k in range (0,len(Y[j])):
if A.iloc[i,j] == Y[j][k]:
A[i,j] = np.nan
ボトルネックは長い外部ループであると思われます.100len(A)
万までです。したがって、これは Pandas を使用する最良の方法ではありません。代わりに、次の方法を使用します。
for j in range(0,85):
for k in range (0,len(Y[j])):
if A.iloc[:,j] == Y[j][k]:
A.iloc[:,j] = np.nan
ただし、後者は例外をスローします。
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
2 つの質問:
- パフォーマンスのボトルネックとベクトル化のメリットについて、私の理解は正しいでしょうか?
- if条件を正しい方法で表現する方法
- Y の計算は高価ではありません。A データフレームの操作方法を決定するためのルックアップ配列です。