Pandas应用函数返回两个新列

22 浏览
0 Comments

Pandas应用函数返回两个新列

我有一个数据框,我想使用apply函数基于现有数据生成两列新数据。我遇到了这个错误:

ValueError: Wrong number of items passed 2, placement implies 1

import pandas as pd
import numpy as np
def myfunc1(row):
    C = row['A'] + 10
    D = row['A'] + 50
    return [C, D]
df = pd.DataFrame(np.random.randint(0,10,size=(2, 2)), columns=list('AB'))
df['C', 'D'] = df.apply(myfunc1 ,axis=1)

初始数据框:

   A  B
0  6  1
1  8  4

期望的数据框:

   A  B  C   D
0  6  1  16  56
1  8  4  18  58

0
0 Comments

Pandas Apply Function That returns two new columns这个问题的出现的原因是因为在处理数据时,使用了apply函数,但是这个函数在处理大量数据时会消耗大量的内存,并且速度较慢。

为了解决这个问题,可以参考一个给出的建议,使用以下代码来实现:

def run_loopy(df):
    Cs, Ds = [], []
    for _, row in df.iterrows():
        c, d, = myfunc1(row['A'])
        Cs.append(c)
        Ds.append(d)
    return pd.Series({'C': Cs,
                      'D': Ds})
def myfunc1(a):
    c = a + 10
    d = a + 50
    return c, d
df[['C', 'D']] = run_loopy(df)

在这个解决方法中,首先定义了一个函数run_loopy,该函数通过循环遍历数据框中的每一行,并调用myfunc1函数来计算新的两列数据C和D的值,然后将这些值添加到对应的列表中。最后,返回一个包含新列C和D的Series对象。

在这个解决方法中,myfunc1函数是一个自定义函数,用于根据输入的值计算新的列C和D的值。在这个例子中,myfunc1函数接收一个参数a,然后根据a的值计算新的列C和D的值,并返回这两个值。

最后,将run_loopy函数应用到数据框df中,并将返回的新列C和D赋值给df的相应列。

另外,文章中还提到了一个小错误,即将代码中的Cs, Ds = []修改为v1s, v2s = []或者反之。这个错误已经被作者注意到,并表示会修改代码以避免混淆。

通过使用这种解决方法,可以显著提高处理大量数据时的内存消耗和速度,从而更高效地处理数据。

0
0 Comments

Pandas Apply函数可以将自定义函数应用于DataFrame的每一行或每一列,并将函数的返回值赋给新的列。然而,在某些情况下,使用apply函数返回多个新列可能会遇到问题。下面的内容给出了一个解决这个问题的方法。

在上述的代码示例中,定义了一个名为myfunc1的函数,该函数接收一个参数row,表示DataFrame中的每一行。然后,函数通过将行中的'A'列的值加上一个固定的数值得到新的列'C'和'D'的值,并返回这两个值。

接下来,通过调用DataFrame的apply函数并传入myfunc1函数,将函数应用于DataFrame的每一行。在apply函数中,设置了参数axis=1,表示对每一行应用函数。另外,还设置了参数result_type='expand',表示将函数的返回值按照列的方式扩展,即返回多个新列。

通过将apply函数的结果赋给df[['C', 'D']],将新的列'C'和'D'添加到原有的DataFrame中。最后,将DataFrame打印出来,即可看到新的列'C'和'D'已经成功添加到了DataFrame中。

从上述内容可以看出,出现这个问题的原因是在使用apply函数返回多个新列时,需要设置参数result_type='expand',否则函数的返回值将以Series的方式返回,无法直接赋值给新的列。

为了解决这个问题,只需在调用apply函数时,设置参数result_type='expand'即可。这样,apply函数将返回多个新列,可以直接赋值给DataFrame中的新列。

总结起来,想要使用Pandas的apply函数返回多个新列,只需在调用apply函数时,设置参数result_type='expand'即可解决这个问题。通过这种方式,可以方便地将自定义函数的返回值赋给新的列,实现更灵活的数据处理操作。

0
0 Comments

根据最新的错误信息,可以通过将新的列作为Series返回来避免错误。

def myfunc1(row):
    C = row['A'] + 10
    D = row['A'] + 50
    return pd.Series([C, D])
df[['C', 'D']] = df.apply(myfunc1 ,axis=1)

请注意,接受的答案在内存消耗和速度方面存在很大问题,下面是另一种解决方法。

0