【问题标题】:Is it possible to use a loc inside a loc in Pandas to replace a value?是否可以在 Pandas 的 loc 中使用 loc 来替换值?
【发布时间】:2020-07-28 04:25:32
【问题描述】:

让我先勾勒一下我要解决的问题。我正在尝试根据包含“-1”的行中的其他两个值,将值“-1”替换为同一列中的另一个值。为了更清楚,这里有一个例子。在下面的数据框中,“所有者”列中有两个缺失值。我想要的是用“所有者”列中的值替换每个“-1”值,该值具有相同的“价格”值,并且是第一个在“时间”中比“-1”值更早出现的值。因此,在本例中,第一个-1 值在第 3 行中找到。对应的“价格”和“时间”是cheap2011-01-01 13:30:00。所以现在,我想用车主的名字替换-1,它有一个cheapcar,这是考虑中的第一个时间,所以是2011-01-01 13:30:00之前的第一个时间。在这种情况下,这将是第 1 行中的那个,所有者名称为 Jane。这也应该自动为任何以下-1 值完成(例如,对于宝马)。

   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']

正如您在最后一行中看到的,这本质上是 loc 中的 loc,而等式右侧的条件均基于 P_T loc。但是,问题来了,因为我不断收到此错误: ValueError: Can only compare identically-labeled Series objects 我认为我做错了什么,也许做的事情没有尽可能高效......所以我真的很感激在这件事上能得到一些帮助。

【问题讨论】:

  • df 和 P_T 的索引不相同,因此是 value_error。你可以使用 ```reindex`` 来做同样的事情。但我不确定这是你想要的

标签: python pandas replace valueerror pandas-loc


【解决方案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

【讨论】:

  • 确实..我对熊猫没有经验,所以我不知道 ffill。非常感谢!
  • @RikHendrickx 没问题,伙计,我稍微编辑了答案以保留您的原始索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2017-07-15
  • 2014-08-17
  • 2021-05-20
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多