为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在 Pandas 的 loc 中使用 loc 来替换值?

是否可以在 Pandas 的 loc 中使用 loc 来替换值?

素胚勾勒不出你 2022-10-11 16:11:20
让我先勾勒一下我要解决的问题。我正在尝试根据包含“-1”的行中的其他两个值,将值“-1”替换为同一列中的另一个值。为了更清楚,这里有一个例子。在下面的数据框中,“所有者”列中有两个缺失值。我想要的是用“所有者”列中的值替换每个“-1”值,该值具有相同的“价格”值,并且是第一个在“时间”中比“-1”值更早出现的值。所以,在这个例子中,第-13 行中找到了第一个值。对应的 'price' 和 'time' 是cheapand 2011-01-01 13:30:00。所以现在,我想-1用车主的名字代替,有cheap车,2011-01-01 13:30:00. 在这种情况下,这将是第 1 行中带有 owner name 的那个Jane。-1对于任何以下值(例如宝马),这也应该自动完成。   brand   price time                 owner0   Honda  cheap 2008-01-01 13:30:00  Marc1  Toyota  cheap 2009-01-01 13:30:00  Jane2    Ford   alot 2010-01-01 13:30:00  Phil3    Audi  cheap 2011-01-01 13:30:00    -14   Volvo  cheap 2012-01-01 13:30:00  Jane5     Bmw   alot 2013-01-01 13:30:00    -1我想解决这个问题的方法是,先定位到-1,然后保存对应的价格和时间,然后及时定位到第一个对应的价格,替换所有者值。我想通过以下方式使用 Pandas Loc 方法(我也包含了制作数据框的代码)。import pandas as pdfrom datetime import datetimecars = {'brand': ['Honda','Toyota','Ford','Audi','Volvo','Bmw'],        'price': ['cheap','cheap','alot','cheap','cheap','alot'],        'time': [datetime.strptime('1/1/2008 1:30 PM', '%m/%d/%Y %I:%M %p'),datetime.strptime('1/1/2009 1:30 PM', '%m/%d/%Y %I:%M %p'),datetime.strptime('1/1/2010 1:30 PM', '%m/%d/%Y %I:%M %p'),datetime.strptime('1/1/2011 1:30 PM', '%m/%d/%Y %I:%M %p'),                 datetime.strptime('1/1/2012 1:30 PM', '%m/%d/%Y %I:%M %p'),datetime.strptime('1/1/2013 1:30 PM', '%m/%d/%Y %I:%M %p')],        'owner': ['Marc', 'Jane','Phil','-1','Jane','-1']}df = pd.DataFrame(cars, columns = ['brand', 'price','time','owner'])P_T = df.loc[df.owner == '-1',['price','time']df.loc[df.owner == '-1', 'owner'] = df.loc[(df.price == P_T.price)&(df.time < P_T.time), 'owner']正如您在最后一行中看到的,这本质上是 loc 中的 loc,而等式右侧的条件均基于 P_T loc。但是,问题来了,因为我不断收到此错误: ValueError: Can only compare identically-labeled Series objects 我认为我做错了什么,并且可能做的事情效率不高......所以我真的很感谢在这件事上提供一些帮助。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我认为您对此过于复杂-本质上您需要做的是-1用按价格列分组的最后一个对应值填充值?如果是这样,前向填充就可以了ffill


import numpy as np

s = df.replace('-1',np.nan).sort_values('time').groupby(['price'])['owner'].ffill()


df['owner'] = df.index.map(s)




print(df)



    brand  price                time owner

0   Honda  cheap 2008-01-01 13:30:00  Marc

1  Toyota  cheap 2009-01-01 13:30:00  Jane

2    Ford   alot 2010-01-01 13:30:00  Phil

3    Audi  cheap 2011-01-01 13:30:00  Jane

4   Volvo  cheap 2012-01-01 13:30:00  Jane

5     Bmw   alot 2013-01-01 13:30:00  Phil


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号