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 को देशी dtype (जैसे np.float64) के NumPy सरणियों पर लागू किया जा सकता है, लेकिन ऑब्जेक्ट सरणियों पर लागू होने पर 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
एक श्रृंखला होती है।