gpt4 book ai didi

python Pandas : Using Aggregate vs Apply to define new columns

转载 作者:太空狗 更新时间:2023-10-30 01:38:19 25 4
gpt4 key购买 nike

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

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. 为什么 apply 有效而不是 aggregte?
  2. 如果在按一组键对数据框进行分组后,我想使用一个函数将组值聚合为一个新列,最好的方法是什么?

提前致谢。

最佳答案

稍微退后一步,执行此特定“聚合”的更快方法是只使用 sum (it's optimised in 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 在进行任何计算之前会尝试一些不同的事情)...如本例所示!

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

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 是什么...

关于 python Pandas : Using Aggregate vs Apply to define new columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com