在熊猫中过滤数据框时复制警告

时间:2020-05-19 23:52:55

标签: python pandas copy

我有汽车及其价格的清单。我需要对价格应用对数转换,但是某些价格设置为0,因此我首先需要创建原始df的副本,并过滤掉价格:

import pandas as pd
import numpy as np

cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand', 'Price'])

print (df)

df2 = df.loc[(df.Price>=22000) & (df.Brand=='Honda Civic')]

print(df2)

df2['logprice']=np.log(df2['Price'])

我收到警告

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

但是我已经在使用.loc

我已经阅读了有关此警告的所有内容,但我仍然不明白自己在做什么错...

2 个答案:

答案 0 :(得分:1)

但是我已经在使用.loc了!

这是你的问题。不要将其用于分配过滤行的副本。使用

df2 = df[(df.Price>=22000) & (df.Brand=='Honda Civic')]

相反。


说明:

问题不是出现在上述命令中,而是出现在随后的命令中:

df2['logprice']=np.log(df2['Price'])

在其左侧解释为

df.loc[(df.Price>=22000) & (df.Brand=='Honda Civic')]['logprice']

请注意危险的][-在赋值运算符的左侧应避免这种情况,因为它可能会更改(在您的情况下添加一列),而不是更改为您的数据框,但只能放入一些临时对象(将被垃圾收集器破坏)。

使用

  • .loc[]可以提供视图或副本(按上下文),而
  • [](在幕后叫.__getitem__()总是返回副本 ,因此作业的左侧< / p>

    df2['logprice']=np.log(df2['Price'])
    

不会像我所说的那样解释,而是明确地在您的 real 数据框中添加新列。

答案 1 :(得分:1)

为了确保没有警告,请添加copy

df2 = df.loc[(df.Price>=22000) & (df.Brand=='Honda Civic')].copy()
df2['logprice']=np.log(df2['Price'])