熊猫:链式作业[重复]

Posted

技术标签:

【中文标题】熊猫:链式作业[重复]【英文标题】:Pandas: Chained assignments [duplicate] 【发布时间】:2014-02-23 04:11:52 【问题描述】:

我一直在阅读关于“返回视图与副本”的 link。我真的不明白 Pandas 中的链式赋值概念是如何工作的,以及 .ix().iloc().loc() 的使用对其有何影响。

我收到以下代码行的 SettingWithCopyWarning 警告,其中 data 是 Panda 数据框,amount 是该数据框中的列(系列)名称:

data['amount'] = data['amount'].astype(float)

data["amount"].fillna(data.groupby("num")["amount"].transform("mean"), inplace=True)

data["amount"].fillna(mean_avg, inplace=True)

看看这段代码,很明显我在做一些次优的事情吗?如果是这样,你能告诉我替换代码行吗?

我知道以下警告,并认为我的情况下的警告是误报:

链式赋值警告/异常旨在通知 可能无效分配的用户。可能有误报; 无意中报告了链式分配的情况。

编辑:导致第一次复制警告错误的代码。

data['amount'] = data.apply(lambda row: function1(row,date,qty), axis=1) 
data['amount'] = data['amount'].astype(float)

def function1(row,date,qty):
    try:
        if(row['currency'] == 'A'):
            result = row[qty]
        else:
            rate = lookup[lookup['Date']==row[date]][row['currency'] ]
            result = float(rate) * float(row[qty])
        return result
    except ValueError: # generic exception clause
        print "The current row causes an exception:"

【问题讨论】:

【参考方案1】:

SettingWithCopy 的目的是警告用户您可能正在做的事情不会像人们预期的那样更新原始数据框。

这里,data 是一个数据帧,可能是单个 dtype(或不是)。然后,您将引用 data['amount'] 这是一个系列,并对其进行更新。这可能适用于您的情况,因为您返回的数据类型与现有数据相同。

但是它可以创建一个副本来更新您看不到的data['amount'] 的副本;然后你会想知道为什么它没有更新。

Pandas 几乎在所有方法调用中都会返回一个对象的副本。 inplace 操作是一种可行的操作,但通常不清楚是否正在修改数据并可能在副本上工作。

这样做更清楚:

data['amount'] = data["amount"].fillna(data.groupby("num")["amount"].transform("mean"))

data["amount"] = data['amount'].fillna(mean_avg)

制作副本的另一个优点。您可以链接操作,这对于 inplace 是不可能的。

例如

data['amount'] = data['amount'].fillna(mean_avg)*2

仅供参考。 inplace 操作既不是更快也不是内存效率更高。 my2c 他们应该被禁止。但该 API 为时已晚。

你当然可以关闭它:

pd.set_option('chained_assignment',None)

Pandas 运行整个测试套件,并将此设置为 raise(因此我们知道是否发生了链接),仅供参考。

【讨论】:

感谢 Jeff,所以我最好删除第二个和第三个警告的 inplace 参数。关于第一个,即data['amount'] = data['amount'].astype(float),不产生复制警告的替代品是什么? 您必须在 分配 astype 之前做一些事情。你能显示更多代码吗? 当然,我将代码添加到我的问题中。 你能在这之前显示data.info()吗?你应该已经有了float64 dtypes。其次,你不需要申请,你可以这样做:data[data['currency']!='A','amount']=data['qty']*data['rate'] 感谢@Jeff 提供此解决方案:pd.set_option('chained_assignment',None) 但是我想知道是否建议这样做,因为我在更改默认警告设置时总是很保守...跨度>

以上是关于熊猫:链式作业[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将链式作业分派到 Lumen 6 中的队列?

作业三(第四周)

数据结构与算法--第5周作业(线性表合并算法)

使用 firebase 作业调度程序安排重复作业

如何取消firebase作业调度程序中的重复作业

用于重复后台作业的延迟作业、守护进程或其他 gem