首页 > 解决方案 > 熊猫根据下一行赋值

问题描述

考虑这个简单的 pandas DataFrame,其中包含“record”、“start”和“param”列。可以有多行具有相同的记录值,每个唯一的记录值对应相同的起始值。但是,对于相同的 'record' 和 'start' 组合,'param' 值可以不同:

pd.DataFrame({'record':[1,2,3,4,4,5,6,7,7,7,8], 'start':[0,5,7,13,13,19,27,38,38,38,54], 'param':['t','t','t','u','v','t','t','t','u','v','t']})

我想创建一个列'end',它取行中的'start'值和下一个唯一值'record'。“结束”列的值应为:

[5,7,13,19,19,27,38,54,54,54,NaN]

我可以使用 for 循环来做到这一点,但我知道在使用 pandas 时这不是首选:

max_end = 100
for idx, row in df.iterrows():
    try:
        n = 1
        next_row = df.iloc[idx+n]
        while next_row['start'] == row['start']:
            n = n+1
            next_row = df.iloc[idx+n]
        end = next_row['start']
    except:
        end = max_end
    df.at[idx, 'end'] = end

有没有一种简单的方法可以在没有 for 循环的情况下实现这一目标?

标签: pythonpandas

解决方案


我毫不怀疑有一个更聪明的解决方案,但这是我的。

df1['end'] = df1.drop_duplicates(subset = ['record', 'start'])['start'].shift(-1).reindex(index = df1.index, method = 'ffill')

-=EDIT=- 添加子集drop_duplicates以考虑问题修正


推荐阅读