Python熊猫:如何(复杂地)修改基于另一列的一列?
我有预订数据,而当客户关联、更改、删除或重新激活订单时,会插入新行。交付显示产品是否实际交付,通常情况下,如果订单在上次更新中未被删除 以下是一些示例代码:Python熊猫:如何(复杂地)修改基于另一列的一列?,python,pandas,group-by,Python,Pandas,Group By,我有预订数据,而当客户关联、更改、删除或重新激活订单时,会插入新行。交付显示产品是否实际交付,通常情况下,如果订单在上次更新中未被删除 以下是一些示例代码: df = pd.DataFrame( { "booking id": [1,1,1,2,2,2,3,3,4,4,4], "booking type": ["initiation", "change", "change"
df = pd.DataFrame(
{
"booking id": [1,1,1,2,2,2,3,3,4,4,4],
"booking type": ["initiation", "change", "change", "initiation", "change", "deletion", "reactivation", "change", "initiation", "change", "deletion"],
"delivered": ["yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "no", "no", "no"]
}
)
有些数据不正确。如果预订id的上一次更新最后一行的预订类型=删除,则此预订id的所有行都应已交付=否
在本例中,我正在寻找以下内容:
df = pd.DataFrame(
{
"booking id": [1,1,1,2,2,2,3,3,4,4,4],
"booking type": ["initiation", "change", "change", "initiation", "change", "deletion", "reactivation", "change", "initiation", "change", "deletion"],
"delivered": ["yes", "yes", "yes", "no", "no", "no", "yes", "yes", "no", "no", "no"]
}
)
我该怎么做?非常感谢 对last使用transform,然后将其分配回
df.loc[df.groupby('booking id')['booking type'].transform('last').eq('deletion'),'delivered']='No'
df
Out[112]:
booking id booking type delivered
0 1 initiation yes
1 1 change yes
2 1 change yes
3 2 initiation No
4 2 change No
5 2 deletion No
6 3 reactivation yes
7 3 change yes
8 4 initiation No
9 4 change No
10 4 deletion No
将变换与last一起使用,然后将其重新指定
df.loc[df.groupby('booking id')['booking type'].transform('last').eq('deletion'),'delivered']='No'
df
Out[112]:
booking id booking type delivered
0 1 initiation yes
1 1 change yes
2 1 change yes
3 2 initiation No
4 2 change No
5 2 deletion No
6 3 reactivation yes
7 3 change yes
8 4 initiation No
9 4 change No
10 4 deletion No
以下是一种使用and的方法:
以下是一种使用and的方法:
使用groupby可能有更好的方法,但我不知道这种方法。我能想到的最好的方法是使用.loc,您可以找到它的引用 基本上,loc返回一段匹配某些特征的数据帧
首先,使用loc获取所有具有任何删除预订类型的ID。其次,循环使用这些ID,并将所有这些ID更改为“否”。使用groupby可能有更好的方法,但我不知道这种方法。我能想到的最好的方法是使用.loc,您可以找到它的引用 基本上,loc返回一段匹配某些特征的数据帧
首先,使用loc获取所有具有任何删除预订类型的ID。第二,循环检查这些ID,并将所有ID更改为“否”。Hi@Julian don’忘了你可以向上投票并接受答案,请看,谢谢!刚刚做了,很抱歉回复晚了!嗨@Julian别忘了你可以投票并接受答案,看,谢谢!刚刚做了,很抱歉回复晚了!这和雅图的解决方案都起了作用;只是这个对我来说更快。谢谢!如果你能解释一下为什么会这样,那就太好了!这和雅图的解决方案都起了作用;只是这个对我来说更快。谢谢!如果你能解释一下为什么会这样,那就太好了!
ids_to_change = df.loc[df['booking type'] == 'deletion', :]['booking id']
for id in ids_to_change:
df.loc[df['booking id'] == id, 'delivered'] = 'no'