当前位置: 首页 > 知识库问答 >
问题:

Pandas:在数据帧中创建两个新列,其中的值是从预先存在的列计算出来的

钱选
2023-03-14

我正在使用熊猫库,我想添加两个新列到一个数据框df有n列(n

要应用的函数类似于:

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)

实现这一目标的最佳方式是什么?我毫无头绪地浏览了文件

**df['column_A']. map(计算)返回一个熊猫系列每个项目由一个元组z, y组成。试图将其分配给两个数据框列会产生一个ValueError。**

共有2个答案

贾实
2023-03-14

在我看来,最重要的答案是有缺陷的。希望没有人会从熊猫导入*中大量导入所有的熊猫到他们的命名空间。此外,当将map方法传递给字典或Series时,应该保留该方法。它可以接受一个函数,但这就是应用程序的用途。

因此,如果必须使用上述方法,我会这样写

df["A1"], df["A2"] = zip(*df["a"].apply(calculate))

实际上没有理由在这里使用zip。您可以简单地执行以下操作:

df["A1"], df["A2"] = calculate(df['a'])

第二种方法在较大的数据帧上也要快得多

df = pd.DataFrame({'a': [1,2,3] * 100000, 'b': [2,3,4] * 100000})

使用300000行创建的数据帧

%timeit df["A1"], df["A2"] = calculate(df['a'])
2.65 ms ± 92.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df["A1"], df["A2"] = zip(*df["a"].apply(calculate))
159 ms ± 5.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

比拉链快60倍

应用通常不会比迭代Python列表快多少。让我们测试for循环的性能,以执行与上述相同的操作

%%timeit
A1, A2 = [], []
for val in df['a']:
    A1.append(val**2)
    A2.append(val**3)

df['A1'] = A1
df['A2'] = A2

298 ms ± 7.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

所以这是速度的两倍,这不是一个糟糕的性能回归,但是如果我们将上述方法加以简化,我们将获得更好的性能。假设您正在使用ipython:

%load_ext cython

%%cython
cpdef power(vals):
    A1, A2 = [], []
    cdef double val
    for val in vals:
        A1.append(val**2)
        A2.append(val**3)

    return A1, A2

%timeit df['A1'], df['A2'] = power(df['a'])
72.7 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果您使用直接矢量化操作,您可以获得更大的速度提升。

%timeit df['A1'], df['A2'] = df['a'] ** 2, df['a'] ** 3
5.13 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

这利用了NumPy极其快速的矢量化操作,而不是我们的循环。我们现在的速度是原来的30倍。

上面的例子应该清楚地显示出apply的速度有多慢,但正因为如此,让我们来看看最基本的例子。让我们对一系列1000万个数字进行平方运算,有无应用

s = pd.Series(np.random.rand(10000000))

%timeit s.apply(calc)
3.3 s ± 57.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

没有应用程序是50倍快

%timeit s ** 2
66 ms ± 2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
鱼浩荡
2023-03-14

我只需要使用zip

In [1]: from pandas import *

In [2]: def calculate(x):
   ...:     return x*2, x*3
   ...: 

In [3]: df = DataFrame({'a': [1,2,3], 'b': [2,3,4]})

In [4]: df
Out[4]: 
   a  b
0  1  2
1  2  3
2  3  4

In [5]: df["A1"], df["A2"] = zip(*df["a"].map(calculate))

In [6]: df
Out[6]: 
   a  b  A1  A2
0  1  2   2   3
1  2  3   4   6
2  3  4   6   9
 类似资料:
  • 我想在Pandas数据集中创建一个新列,基于另外两个列的值。 现在,应该如下所示: 有什么帮助吗?

  • 问题内容: 我正在使用pandas库,我想将两个新列添加到具有n列(n> 0)的数据框中。 这些新列是由于将函数应用于数据框中的某一列而产生的。 要应用的功能如下: 为仅返回值的函数创建新列的一种方法是: 所以,我想要的但尝试失败的(*)是这样的: 实现此目的的最佳方法是什么?我毫无头绪地扫描了文档。 *返回一个熊猫系列,每个项目都由一个元组z,y组成。尝试将其分配给两个数据框列会产生ValueE

  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 基本上,它应该在步骤中找到指标为43且步骤=1的行,然后将该值放在新列中,在这种情况下,它将是“Gross value Added”。任何帮助都将非常感谢!

  • 我有一个pandas dataframe,需要根据dataframe中其他列的值创建新列。这是数据帧 人城市国家国家 美国伊利诺伊州芝加哥 美国亚利桑那州凤凰城B酒店 C美国加利福尼亚州圣地亚哥 我想根据state中的值创建两个新列 创建新列df[“城北”]=df[“城市”]其中state=“伊利诺伊” 创建新列df[“城市南部”]=df[“城市”],其中州不等于“伊利诺伊州” 我试过了 但是不等

  • 我想在数据的每一列中找到的数量,这样,如果某一列的少于某个阈值,我就可以删除该列。我看了一下,但没有找到任何功能。对我来说太慢了,因为大多数值都是不同的,而且我只对计数感兴趣。