在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萬排。我需要一種快速的方法來知道哪一列是具有非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 on isna, then mask

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

Output:

     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。

主站蜘蛛池模板: 无码精品黑人一区二区三区| 国产一区二区三区不卡在线看| 四虎精品亚洲一区二区三区| 亚洲bt加勒比一区二区| 国产一区二区福利久久| 国产午夜一区二区在线观看| 国产一区二区精品久久| 欧美日韩综合一区二区三区| 亚洲国产成人一区二区三区| 日韩精品无码一区二区三区AV| 一区二区三区免费看| 加勒比无码一区二区三区| 乱子伦一区二区三区| 无码国产伦一区二区三区视频 | 亚洲av无码一区二区三区不卡 | 免费日本一区二区| 国产精品538一区二区在线| 亚洲国产欧美一区二区三区 | 亚洲一区中文字幕在线电影网| 亚洲一区二区三区在线播放| 成人精品一区久久久久| 日本精品3d动漫一区二区| 怡红院一区二区在线观看| 另类国产精品一区二区| 欧洲精品一区二区三区| 免费在线观看一区| 国产一区二区三区免费观在线| 波多野结衣的AV一区二区三区| 精品福利一区二区三区精品国产第一国产综合精品| 在线精品一区二区三区电影| 精品乱码一区二区三区在线 | 国模吧一区二区三区精品视频| 国模无码视频一区| 精品国产一区二区三区AV性色 | 在线视频一区二区三区四区| 国产成人AV区一区二区三| 一区二区3区免费视频| 国产午夜精品一区二区三区漫画 | 国产婷婷一区二区三区| 色窝窝无码一区二区三区成人网站| 中文字幕在线一区二区在线 |