我正在使用pandas库,我想将两个新列添加到具有n列(n>;0)的数据帧df
这些新列是对dataframe中的一列应用函数的结果。
应用的功能如下:
def calculate(x):
...operate...
return z, y
为只返回值的函数创建新列的一种方法是:
df['new_col']) = df['column_A'].map(a_function)
所以,我想要的,并且尝试失败的,是像:
(df['new_col_zetas'], df['new_col_ys']) = df['column_A'].map(calculate)
实现这一目标的最佳方法是什么?我毫无头绪地扫描了一下documentation。
**df['column_A'].map(calculate)
返回一个pandas系列,每个项由一个元组z,y组成。如果试图将其分配给两个dataframe列,则会产生一个ValueError.*
我就用
zip
:在我看来,最高答案是有缺陷的。希望没有人用
from pandas import *
将所有熊猫大量导入其名称空间。此外,在传递字典或序列时,map
方法应保留给那些时间。它可以接受一个函数,但这就是apply
的用途。所以,如果你一定要用上面的方法,我会这样写
实际上没有理由在这里使用zip。您只需执行以下操作:
第二种方法在较大的数据帧上也要快得多
用300000行创建的数据帧
比拉链快60倍
一般情况下,避免使用apply
Apply通常不会比遍历Python列表快多少。让我们测试for循环的性能,以执行与上面相同的操作
所以这是两倍的速度,这不是一个糟糕的性能回归,但是如果我们把上面的方法化,我们会得到更好的性能。假设您使用的是ipython:
直接分配而不应用
如果使用直接矢量化操作,您可以获得更大的速度改进。
这利用了NumPy极其快速的矢量化操作,而不是我们的循环。现在我们的速度比原来提高了30倍。
最简单的速度测试
上面的例子应该清楚地显示出
apply
的速度有多慢,但是让我们看看最基本的例子。让我们把一系列1000万的数字加上和不加上不使用比使用快50倍
相关问题 更多 >
编程相关推荐