【问题标题】:Pandas lambda multiple argument in returnPandas lambda 多个参数作为回报
【发布时间】:2018-12-19 08:52:29
【问题描述】:
import pandas as pd
import numpy as np

def ced(x):
    return x+1, x+2, x+3


df = pd.DataFrame(data=[[1,2],[10,20]], columns=['a','b'])


df['x'], df['y'], df['z'] = df['a'].apply(lambda x: ced(x)) 


print(df)

错误:

第 11 行,在 df['x'], df['y'], df['z'] = df['a'].apply(lambda x: ced(x)) ValueError: no enough values to unpack (预期 3, 得到2)

这东西适用于

import pandas as pd
import numpy as np

def ced(x):
    return x+1, x+2


df = pd.DataFrame(data=[[1,2],[10,20]], columns=['a','b'])


df['x'], df['y'] = df['a'].apply(lambda x: ced(x)) 


print(df)

输出:

    a   b  x   y
0   1   2  2  11
1  10  20  3  12

我不知道这里有什么问题。

【问题讨论】:

    标签: python python-3.x pandas lambda arguments


    【解决方案1】:

    我建议更改函数以返回 Series 和新列的子集:

    def ced(x):
        return pd.Series([x+1, x+2, x+2])
    
    df = pd.DataFrame(data=[[1,2],[10,20]], columns=['a','b'])
    
    
    df[['x','y', 'z']] = df['a'].apply(lambda x: ced(x)) 
    
    print(df)
        a   b   x   y   z
    0   1   2   2   3   3
    1  10  20  11  12  12
    

    另一种解决方案是通过构造函数创建DataFrame

    def ced(x):
        return x+1, x+2, x+2
    
    df = pd.DataFrame(data=[[1,2],[10,20]], columns=['a','b'])
    
    
    df[['x','y', 'z']] = pd.DataFrame(df['a'].apply(lambda x: ced(x)).values.tolist())
    print(df)
        a   b   x   y   z
    0   1   2   2   3   3
    1  10  20  11  12  12
    

    【讨论】:

    • 对于大型数据帧,你能说出第一个更快还是第二个更快?
    • @Nihal - 我想是第二个。
    • @Nihal - 刚刚测试过In [260]: %timeit df[['x','y', 'z']] = pd.DataFrame(df['a'].apply(lambda x: ced(x)).values.tolist()) 3.05 ms ± 99.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [262]: %timeit df[['x','y', 'z']] = df['a'].apply(lambda x: ced(x)) 349 ms ± 8.56 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    • df = pd.concat([df] * 1000, ignore_index=True)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-12-27
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多