熊猫应用函数返回两个新列

use*_*044 4 python python-2.7 pandas

我有一个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)
Run Code Online (Sandbox Code Playgroud)

启动DF:

   A  B
0  6  1
1  8  4
Run Code Online (Sandbox Code Playgroud)

所需DF:

   A  B  C   D
0  6  1  16  56
1  8  4  18  58
Run Code Online (Sandbox Code Playgroud)

小智 10

这个对我有用:

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, result_type='expand')
df
Run Code Online (Sandbox Code Playgroud)

添加:==>> result_type='expand',

问候!


Fed*_*ato 8

请注意所接受答案的巨大内存消耗和低速度: https: //ys-l.github.io/posts/2015/08/28/how-not-to-use-pandas-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 Code Online (Sandbox Code Playgroud)


Mio*_*Mio 6

根据您的最新错误,可以通过将新列作为系列返回来避免错误

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

df[['C', 'D']] = df.apply(myfunc1 ,axis=1)
Run Code Online (Sandbox Code Playgroud)