大佬教程收集整理的这篇文章主要介绍了如果满足多个条件,如何将一列的值设置为等于另一列?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个类似 ID 和多个事件以及一个开始日期的数据框。我想让结束日期与下一个事件的开始日期相同,如果下一个事件没有开始日期,则为 null。
ID event start end
1 a 01/01/21
1 b 02/01/21
1 c 03/01/21
1 d 04/01/21
1 e
2 b 05/01/21
2 c 01/01/21
2 a 02/01/21
2 d 04/01/21
2 e
3 e
3 b 01/01/21
3 d 02/01/21
3 a 04/01/21
3 c 04/01/21
如果 ID 1 和事件 b 有开始日期,我希望它是 ID 1 和事件 a 的结束日期。 所以基本上每个下一个事件开始日期都是同一个 ID 的前一个事件结束日期,我想遍历整个数据框。
我希望数据框看起来像
ID event start end
1 a 01/01/21 01/01/21
1 b 02/01/21 03/01/21
1 c 03/01/21 04/01/21
1 d 04/01/21
1 e
2 b 05/01/21 01/01/21
2 c 01/01/21 04/01/21
2 a 02/01/21 05/01/21
2 d 04/01/21
2 e
3 e
3 b 01/01/21 04/01/21
3 d 02/01/21
3 a 04/01/21 01/01/21
3 c 04/01/21 02/01/21
我尝试使用像这样的 for 循环,但我无法让它工作。
for s in data["ID"]:
row = data[(data["ID"] == s) & (data["event"] == "a")]
if row["Start_Date"].isnull == True:
pass
else:
row1 = data[(data["ID"] == s) & (data["event"] == "b")]
if row1["start"].isnull == True:
pass
else:
row["end"] = row1["start"]
有没有更好的方法来做到这一点,或者我是否在正确的轨道上,但我的执行失败了?我怎样才能实现我想要的数据框?任何帮助将不胜感激。
编辑:事件并不总是按顺序排列,因此我尝试使用循环遍历每一行并手动检查它前面的特定事件。
您可以首先使用 ascending
按 sort_values()
的 2 列、ID 和事件对数据框进行排序。然后,您可以使用 groupby
和 shift()
来获取上一个事件的开始日期,并将其指定为下一个事件的结束。
为了保持数据框的结构不变(因为我们正在对值进行排序,但我们想恢复到原始的 index
),在我们的第一步中,让我们创建一个列表,该列表将作为 {{1 }} 我们可以在最后使用。这样我们就可以确保保持数据集的原始结构。
组合成代码:
index
会让你回到你想要的结果:
# Store your initial index
s = df.index.tolist()
# Sort values by ID and Event in ascending order
df.sort_values(by=['ID','event'],ascending=[True,True],inplace=TruE)
# Get the end date,which is the start date of the previous event
df['end']=df.groupby('ID')['start'].shift(-1)
# Make sure your columns are dates
df['start'],df['end'] = df['start'].dt.date,df['end'].dt.date
df.fillna('',inplace=TruE)
# Reindex to get the initial structure
df.reindex(s)
以上是大佬教程为你收集整理的如果满足多个条件,如何将一列的值设置为等于另一列?全部内容,希望文章能够帮你解决如果满足多个条件,如何将一列的值设置为等于另一列?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。