【问题标题】:ValueError: can only convert an array of size 1 to a Python scalar : apply lambda to functionValueError:只能将大小为 1 的数组转换为 Python 标量:将 lambda 应用于函数
【发布时间】:2021-05-28 09:28:39
【问题描述】:

我有两个共享两个公共列“a”和“b”的数据框。我想创建一个函数,在 df1 中按类汇总“amount”的值,并将其添加到 df2 作为“sum”列。

这里是 df1 和 df2。

df1
    a         b   class amount
0   orange  ichi    1   10
1   apple   ni      2   20
2   peach   san     3   40
3   banana  shi     2   15
4   lemon   go      1   30

df2
 a          b     
0   apple   ni     
1   orange  ichi   
2   lemon   go     
3   peach   san    
4   banana  shi    
5   apple   ni   
6   lemon   go  

我想像这样在 df2 中添加“sum”列。

df2
 a          b      sum
0   apple   ni     35
1   orange  ichi   40
2   lemon   go     40
3   peach   san    30
4   banana  shi    35
5   apple   ni     35
6   lemon   go     40

我创建了这个函数,它按组返回“金额”的总数。

#function
def num_count(a,b):
    
    df1["sum"] = df1.groupby(['class'])['amount'].transform('sum')
    amount_total = df1["sum"][(df1["a"] == str(a)) & (df1["b"] == str(b))]
    return amount_total.item()

我正在尝试将此函数应用于 df2,但出现如下错误。 有谁知道如何解决这个错误?

df2['sum'] = df2.apply(lambda x: num_count(x['a'], x['b']), axis=1)

>>> ValueError: can only convert an array of size 1 to a Python scalar

【问题讨论】:

    标签: python pandas function lambda


    【解决方案1】:

    一种通过合并解决的方法:

    1. 通过groupby/transform 评估第一个数据帧的总和。转换允许您保留数据帧的原始结构。
    2. 使用assign 方法将结果分配回第一个数据帧。
    3. 从第一个数据框中删除不需要的列。
    4. 最后做左合并
    df2 = (
        df2.merge(
            df1.assign(
                sum=df1.groupby(['class'])['amount']
                .transform('sum'))
            .drop(['class', 'amount'], 1
                  ),
            how='left',
            on=['a', 'b'])
    )
    

    输出:

            a     b  sum
    0   apple    ni   35
    1  orange  ichi   40
    2   lemon    go   40
    3   peach   san   40
    4  banana   shi   35
    5   apple    ni   35
    6   lemon    go   40
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 2019-02-27
      • 2023-01-14
      • 1970-01-01
      • 2021-08-13
      • 2021-10-17
      • 2018-07-22
      • 2021-07-08
      相关资源
      最近更新 更多