我有以下數據框:
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萬排。我需要一種快速的方法來知道哪一列是具有非null值的最后一個連續列。以該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中建議最快的方法嗎?對于為什么該方法優于我的方法,我們也非常感謝您提供一個簡單的技術解釋:)
Try
cumsum
onisna
, thenmask
Output:
解釋:
df.isna()
用True
屏蔽nan
,否則False
。然后取cumsum(axis=1)
,可以找到迄今為止nan
的累計數(在行上)。最后,所有cumsum
>=1表示該位置之前有一個nan
。