pandas.DataFrame.combine_firstก็ใช้ได้เช่นกัน
(ข้อควรระวัง: เนื่องจาก "คอลัมน์ดัชนีผลลัพธ์จะรวมกันของดัชนีและคอลัมน์ที่เกี่ยวข้อง" คุณควรตรวจสอบดัชนีและคอลัมน์ที่ตรงกัน )
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
เปรียบเทียบกับคำตอบอื่น ๆ :
%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)
ฉันไม่ได้ใช้วิธีนี้ด้านล่าง:
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)
เพราะจะเพิ่มข้อยกเว้น:
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')
ซึ่งหมายความว่า np.isnan สามารถนำไปใช้กับอาร์เรย์ NumPy ของ dtype ดั้งเดิม (เช่น np.float64) แต่จะเพิ่ม TypeError เมื่อใช้กับอาร์เรย์อ็อบเจ็กต์
ดังนั้นฉันจึงแก้ไขวิธีการ:
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
ต้องใช้ซีรีส์