Python Pandas。使用聚合与应用来定义新的列[英] Python Pandas: Using Aggregate vs Apply to define new columns

本文是小编为大家收集整理的关于Python Pandas。使用聚合与应用来定义新的列的处理方法,想解了Python Pandas。使用聚合与应用来定义新的列的问题怎么解决?Python Pandas。使用聚合与应用来定义新的列问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

假设我有一个这样的数据框:

n = 20
dim1 = np.random.randint(1, 3, size=n)
dim2 = np.random.randint(3, 5, size=n)
data1 = np.random.randint(10, 20, size=n)
data2 = np.random.randint(1, 10, size=n)
df = pd.DataFrame({'a': dim1, 'b': dim2 ,'val1': data1, 'val2': data2})

如果我定义一个按组返回的函数:

def h(x):
    if x['val2'].sum() == 0:
        return 0
    else:
        return (x['val1'].sum())*1.0/x['val2'].sum()*1.0

按其中一列分组并聚合返回结果:

df.groupby(['a']).aggregate(h)['val1']

尽管它将所有现有列转换为所需的结果,而不是添加新列

使用聚合时按两列分组会导致错误:

df.groupby(['a','b']).aggregate(h)['val1']

KeyError: 'val2'

但是为 apply 切换聚合似乎可行.

我有两个问题:

  1. 为什么应用有效而不聚合?
  2. 如果在按一组键对数据框进行分组后,我想使用一个将组值聚合为新列的函数,那么最好的方法是什么?

提前致谢.

推荐答案

稍微退后一步,进行这种特定"聚合"的更快方法是使用 sum(已在 cython 中优化) 几次.

In [11]: %timeit g.apply(h)
1000 loops, best of 3: 1.79 ms per loop

In [12]: %timeit g['val1'].sum() / g['val2'].sum()
1000 loops, best of 3: 600 µs per loop

IMO groupby 代码非常繁琐,通常通过创建它所看到的值的列表来懒惰地"黑盒"查看正在发生的事情:

def h1(x):
   a.append(x)
   return h(x)
a = []

警告:有时此列表中的数据类型并不一致(pandas 在进行任何计算之前会尝试一些不同的事情)...如本例所示!

第二个聚合在 each 列上应用时卡住了,因此该组(引发错误):

0     10
4     16
8     13
9     17
17    17
19    11
Name: val1, dtype: int64

这是 val1 列的子系列,其中 (a, b) = (1, 3).

这很可能是一个错误,在这引发之后也许它可以尝试其他方法(我怀疑这就是第一个版本有效的原因,它是特殊情况)...

对于那些感兴趣的人,我得到的 a 是:

In [21]: a
Out[21]: 
[SNDArray([125755456, 131767536,        13,        17,        17,        11]),
 Series([], name: val1, dtype: int64),
 0     10
4     16
8     13
9     17
17    17
19    11
Name: val1, dtype: int64]

我不知道 SNDArray 到底是什么...

本文地址:https://www.itbaoku.cn/post/1728040.html