Мы можем использовать numpy
nanmax
здесь для эффективного решения:
a = df.values
np.nanmax(a, 0) == a[np.isnan(a).argmin(0), np.arange(a.shape[1])]
array([False, True])
Сроки (Здесь представлено множество вариантов):
Функция
def chris(df):
a = df.values
return np.nanmax(a, 0) == a[np.isnan(a).argmin(0), np.arange(a.shape[1])]
def bradsolomon(df):
df.values[df.notnull().idxmax(), np.arange(df.shape[1])] == df.max(axis=0).values
def wen1(df):
return df.groupby([1]*len(df)).first()==df.max()
def wen2(df):
return df.bfill().iloc[0]==df.max()
def wen3(df):
return df.idxmax()==df.apply(pd.Series.first_valid_index)
def rafaelc(df):
return np.isnan(df.values).argmin(axis=0) == df.fillna(-np.inf).values.argmax(axis=0)
def pir(df):
return df.notna().idxmax() == df.idxmax()
Настройка
res = pd.DataFrame(
index=['chris', 'bradsolomon', 'wen1', 'wen2', 'wen3', 'rafaelc', 'pir'],
columns=[10, 20, 30, 100, 500, 1000],
dtype=float
)
for f in res.index:
for c in res.columns:
a = np.random.rand(c, c)
a[a > 0.4] = np.nan
df = pd.DataFrame(a)
stmt = '{}(df)'.format(f)
setp = 'from __main__ import df, {}'.format(f)
res.at[f, c] = timeit(stmt, setp, number=50)
ax = res.div(res.min()).T.plot(loglog=True)
ax.set_xlabel("N");
ax.set_ylabel("time (relative)");
plt.show()
Результаты