Pandas:在数据框中创建两个新列,其值是根据现有列计算得出的。

46 浏览
0 Comments

Pandas:在数据框中创建两个新列,其值是根据现有列计算得出的。

我正在使用pandas库,想要向一个包含n列(n > 0)的数据框df中添加两个新列。

这两个新列是通过对数据框中的一列应用函数得到的。

函数的定义如下:

def calculate(x):

...操作...

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(calculate)返回一个pandas Series,其中每个项都是一个元组z, y。尝试将其分配给两个数据框列会产生ValueError错误。

0
0 Comments

Pandas: 从一个已存在的列中计算出两个新列

Pandas是一个强大的数据处理工具,它提供了许多用于处理和转换数据的函数和方法。在处理数据时,有时我们需要根据一个已存在的列来计算出新的列。本文将介绍如何使用Pandas在一个DataFrame中创建两个新列,并将其值计算从一个已存在的列中得到。

问题的出现原因是我们希望根据一个已存在的列来计算出新的列。在这个问题中,我们有一个DataFrame,其中包含一个名为"column_A"的列,我们希望使用这个列的值计算出两个新的列"new_col1"和"new_col2"。

解决这个问题的方法是使用Pandas的pipe函数。pipe函数可以接受一个函数作为参数,并将DataFrame的列作为参数传递给该函数。函数将对传入的列进行计算,并返回计算后的结果。通过将pipe函数与赋值操作符结合使用,我们可以将计算后的结果赋值给新的列。

下面是解决这个问题的代码示例:

df['new_col1'], df['new_col2'] = df['column_A'].pipe(calculate)

在这个代码示例中,calculate是一个用于计算新列值的函数。pipe函数将DataFrame的"column_A"列作为参数传递给calculate函数,并返回计算后的结果。最后,计算后的结果将分配给"new_col1"和"new_col2"两列。

通过使用这个方法,我们可以方便地根据一个已存在的列计算出新的列,并将其值存储在DataFrame中。这对于数据处理和转换非常有用,可以帮助我们更高效地处理和分析数据。

总结起来,本文介绍了如何使用Pandas的pipe函数根据一个已存在的列计算出两个新列的方法。通过使用这个方法,我们可以方便地处理和转换数据,并将计算后的结果存储在DataFrame中。希望本文对你理解和使用Pandas提供的功能有所帮助。

0
0 Comments

问题的原因是在给数据框创建新列时,使用了不推荐的方法,并且使用了较慢的方法。解决方法是使用更快的向量化操作来直接赋值,或者使用Cython来优化循环的性能。

在给数据框创建新列时,可以使用apply方法,但是这种方法的性能较慢。在一个示例中,使用apply方法对包含10000000个数字的Series进行平方操作的时间是3.3秒,而直接使用向量化操作只需要66毫秒,速度提升了50倍。

另一种解决方法是使用Cython来优化循环的性能。通过将循环中的操作用Cython编写,可以显著提高性能。在示例中,使用Cython优化后的循环操作时间为72.7毫秒,比使用apply方法快了4倍。

另外,还可以直接使用向量化操作来创建新列,这种方法利用了NumPy的快速向量化操作,比循环更加高效。在示例中,直接使用向量化操作的时间为5.13毫秒,比使用apply方法快了30倍。

总结起来,避免使用apply方法可以提高性能。可以选择使用向量化操作或者使用Cython来优化循环的性能。但是需要注意,在某些特定情况下,使用apply或者applymap方法可能是必要的,比如对数据框的每个元素应用特定函数的情况。

0
0 Comments

问题的出现原因是用户想要在一个DataFrame中创建两个新列,这两个新列的值是从一个已存在的列计算得出的。解决方法是使用Pandas的zip函数和map方法来实现。

代码如下:

from pandas import *
def calculate(x):
    return x*2, x*3
df = DataFrame({'a': [1,2,3], 'b': [2,3,4]})
df["A1"], df["A2"] = zip(*df["a"].map(calculate))

上述代码首先定义了一个calculate函数,该函数接受一个参数x,并返回x的两倍和三倍。然后创建了一个DataFrame对象df,该对象包含两列,分别是'a'和'b'列,每列的值分别为[1,2,3]和[2,3,4]。接下来通过使用zip函数和map方法,将calculate函数应用于'a'列,并将结果分别赋给'A1'和'A2'列。最后,输出DataFrame对象df,可以看到新创建的两列'A1'和'A2'的值分别为[2,4,6]和[3,6,9]。

在的问题中,还有其他一些相关的内容。首先,有一个用户提到在文档中没有找到类似的用法,这可能是因为该用法在文档的版本中不存在。其次,有用户提出了一个性能问题,问在使用map函数时,使用zip(*map(calculate,df["a"]))和zip(*df["a"].map(calculate"))是否有差别。最后,有用户在创建新列时收到一个警告,警告信息为"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.",并询问是否需要担心这个警告。

以上是对问题出现原因和解决方法的整理。

0