pandas.DataFrame.combine_first de çalışır.
( Dikkat: "Sonuç dizini sütunları, ilgili dizinlerin ve sütunların birleşimi olacağından", dizin ve sütunların eşleşip eşleşmediğini kontrol etmelisiniz. )
import numpy as np
import pandas as pd
df = pd.DataFrame([["1","cat","mouse"],
["2","dog","elephant"],
["3","cat","giraf"],
["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])
In: df["Cat1"].combine_first(df["Cat2"])
Out:
0 cat
1 dog
2 cat
3 ant
Name: Cat1, dtype: object
Diğer yanıtlarla karşılaştırın:
%timeit df["Cat1"].combine_first(df["Cat2"])
181 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit df['Cat1'].fillna(df['Cat2'])
253 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
88.1 µs ± 793 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Aşağıdaki bu yöntemi kullanmadım:
def is_missing(Cat1,Cat2):
if np.isnan(Cat1):
return Cat2
else:
return Cat1
df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
çünkü bir İstisna yaratacaktır:
TypeError: ("ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''", 'occurred at index 0')
bu, np.isnan'ın yerel dtype (np.float64 gibi) NumPy dizilerine uygulanabileceği, ancak nesne dizilerine uygulandığında TypeError'ı yükselttiği anlamına gelir .
Bu yüzden yöntemi revize ediyorum:
def is_missing(Cat1,Cat2):
if pd.isnull(Cat1):
return Cat2
else:
return Cat1
%timeit df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
701 µs ± 7.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
fillna
bir dizi sürdüğünü bilmiyordum .