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

问题描述 投票:2回答:1

让我先概述我要解决的问题。我试图根据包含“ -1”的行中的其他两个值,用同一列中的另一个值替换“ -1”值。更清楚地说,这是一个示例。在下面的数据框中,“所有者”列中有两个缺失值。我想要的是用“所有者”列中具有相同“价格”值的值替换每个“ -1”值,并且该值是在“时间”中早于“ -1”值的第一个值。因此,在此示例中,第3行中找到第一个-1值。相应的'价格'和'时间'是cheap2011-01-01 13:30:00。因此,现在,我想用拥有者-1汽车的所有者的名字替换cheap,这是考虑中的汽车之前的第一个时间,因此也是2011-01-01 13:30:00之前的第一次。在这种情况下,该行将是第1行中的行,所有者名称为Jane。对于以下任何-1值(例如Bmw),也应该自动执行此操作。

   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    -1
4   Volvo  cheap 2012-01-01 13:30:00  Jane
5     Bmw   alot 2013-01-01 13:30:00    -1

我想解决此问题的方法是,首先找到-1,然后保存相应的价格和时间,然后及时找到第一个相应的价格并替换所有者值。我想通过以下方式使用Pandas Loc方法(我也包括了制作数据框的代码)。

import pandas as pd
from datetime import datetime

cars = {'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']

如您在最后一行中所见,这实际上是一个位置中的一个位置,而等式右侧的条件均基于P_T位置。但是,随着我不断收到此错误,这里出现了问题:ValueError: Can only compare identically-labeled Series objects我认为我做错了事,也许做的事情效率不高。因此,我非常感谢您提供一些帮助。

python pandas replace valueerror loc
1个回答
1
投票

[我认为您已经解决了这一问题-本质上,您需要做的是用价格列分组的最后一个对应值来填充-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
© www.soinside.com 2019 - 2024. All rights reserved.