在pandas (Python)中跨列比较值的最快方法是什么?



我有以下数据框架:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.array([[1, 1, 1, 1], [1, 1, np.nan, 1], [1, np.nan, 1, 1]]),
columns=['t', 't_1', 't_2', 't_3'])

实际上有~ 1000万行。我需要一个快速的方法来知道哪个是最后一个连续列,有一个非空值。以这个df为例,结果将是->

df_result = pd.DataFrame(np.array([[1, 1, 1, 1], [1, 1, np.nan, np.nan], [1, np.nan, np.nan, np.nan]]),
columns=['t', 't_1', 't_2', 't_3'])

目前我正在使用以下lambda函数进行此操作,但结果太慢:

def second_to_last_null(*args):
for i in range(len(args)):
if np.isnan(args[i]):
return np.nan
else:
return args[-1]

df_result['t'] = df['t']
df_result['t_1_consecutive'] = df[['t', 't_1']].apply(lambda x: second_to_last_null(x.t, x.t_1), axis=1)
df_result['t_2_consecutive'] = df[['t', 't_1', 't_2']].apply(lambda x: second_to_last_null(x.t, x.t_1, x.t_2), axis=1)
df_result['t_3_consecutive'] = df[['t', 't_1', 't_2', 't_3']].apply(lambda x: second_to_last_null(x.t, x.t_1, x.t_2, x.t_3), axis=1)

有人能建议在Pandas或Numpy中最快的方法吗?一个简单的技术解释,为什么那个方法比我的好。

isna上尝试cumsum,然后mask

df_result = df.mask(df.isna().cumsum(axis=1) >= 1)

输出:

t  t_1  t_2  t_3
0  1.0  1.0  1.0  1.0
1  1.0  1.0  NaN  NaN
2  1.0  NaN  NaN  NaN

:df.isna()True掩码nan,否则False。然后使用cumsum(axis=1),可以找到nan到目前为止的累积数量(在行上)。最后,所有cumsum>= 1表示在该位置之前存在nan

相关内容

最新更新