Pandas根据每列的条件获得最后一个值的位置(高效)

xfb7svmp  于 2022-12-28  发布在  其他
关注(0)|答案(2)|浏览(336)

我想得到 Dataframe 中每一列的值1最后出现在哪一行的信息,给定最后一行的索引,我想计算出现的"最近",如下所示:

>> df = pandas.DataFrame({"a":[0,0,1,0,0]," b":[1,1,1,1,1],"c":[1,0,0,0,1],"d":[0,0,0,0,0]})
>> df
   a  b  c  d
0  0  1  1  0
1  0  1  0  0
2  1  1  0  0
3  0  1  0  0
4  0  1  1  0

预期结果:

>> calculate_recency_vector(df)
[3,1,1,None]

所需的结果显示了每列"多少行之前"的值1最后一次出现。例如,对于列a,值1最后出现在倒数第三行,因此3在结果向量中的新近性。有什么想法如何实现这一点?
编辑:为了避免混淆,我将最后一列的期望输出从0改为None,因为值1根本没有出现,所以该列没有最近出现。
编辑II:谢谢你的回答!我必须在 Dataframe 形状(42,250)上计算这个最近向量大约150k次。如果有更有效的解决方案,我将不胜感激。

wgeznvg7

wgeznvg71#

这个

df = pandas.DataFrame({"a":[0,0,1,0,0]," b":[1,1,1,1,1],"c":[1,0,0,0,1],"d":[0,0,0,0,0]})
df.apply(lambda x : ([df.shape[0] - i for i ,v in x.items() if v==1] or [None])[-1], axis=0)

产生所需的输出作为pd.Series,唯一的区别是结果是浮点的,并且None被PandasNan代替,u然后可以取所需的列

kognpnkq

kognpnkq2#

使用此示例 Dataframe ,您可以定义函数,如下所示:

def calculate_recency_vector(df: pd.DataFrame, condition: int) -> list:
    recency_vector = []

    for col in df.columns:
        last = 0
        for i, y in enumerate(df[col].to_list()):
            if y == condition:
                last = i

        recency = len(df[col].to_list()) - last
        if recency == len(df[col].to_list()):
            recency = None

        recency_vector.append(recency)

    return recency_vector

运行该函数,它将返回:

calculate_recency_vector(df, 1)
[3, 1, 1, None]

相关问题