python - 熊猫根据下一行赋值
问题描述
考虑这个简单的 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 循环的情况下实现这一目标?
解决方案
我毫不怀疑有一个更聪明的解决方案,但这是我的。
df1['end'] = df1.drop_duplicates(subset = ['record', 'start'])['start'].shift(-1).reindex(index = df1.index, method = 'ffill')
-=EDIT=- 添加子集drop_duplicates
以考虑问题修正
推荐阅读
- docker - Docker `COPY` 文件到容器中不是持久的
- python - 计算图像顺序“流”中颜色变化的索引
- web-scraping - 使用 beautifulsoup 从 iframe 中获取价值
- r - 执行正确数据分析的步骤
- php - 表单操作正在刷新 html 页面,使其在域中生效
- php - 如何修复使用 file_get_html
- javascript - 在NodeJS中使用相同的参数在回调函数中调用父函数
- r - `tm` 包中的 `tm_map` 中的自定义函数
- css - 如何调整我的 blogspot 博客标题中的标题?
- haskell - optparse-applicative 非空字符串参数