pandas.DataFrame.combine_first cũng hoạt động.
( Chú ý: vì "Các cột chỉ mục kết quả sẽ là sự kết hợp của các chỉ mục và cột tương ứng", bạn nên kiểm tra chỉ mục và các cột có khớp không. )
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
So sánh với các câu trả lời khác:
%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)
Tôi đã không sử dụng phương pháp này bên dưới:
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)
bởi vì nó sẽ tăng một Ngoại lệ:
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')
có nghĩa là np.isnan có thể được áp dụng cho các mảng NumPy của loại dtype gốc (chẳng hạn như np.float64), nhưng lại làm tăng TypeError khi áp dụng cho các mảng đối tượng .
Vì vậy, tôi sửa đổi phương pháp:
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
phải mất một loạt.