gpt4 book ai didi

python - 如何使用聚合方法从 Pandas 系列中获取唯一值?

转载 作者:行者123 更新时间:2023-11-28 20:36:34 29 4
gpt4 key购买 nike

考虑这个数据框

df = pandas.DataFrame(numpy.random.randint(0,100,size=(200, 4)), columns=list('ABCD'))
df['E'] = list(numpy.arange(1001, 1021)) * 10
df['F'] = ['c', 'b', 'b', 'a', 'd'] * 20 + ['d', 'a', 'b', 'b', 'c'] * 20

我想按“E”列分组,但我想聚合一些函数。例如,A、B、D 列的 sum 值和 C 列的 count 值。对于“F”列,我想在数组中获取唯一值。

所以我尝试了:

params = {
'A': 'sum',
'B': 'sum',
'C': 'count',
'D': 'sum',
'F': pandas.Series.unique
}
df_ = df.groupby('E').agg(params).reset_index()

返回错误:Exception: Must produce aggregated value

我尝试了这段代码,因为它在另一个例子中有效。从那以后,我一直在尝试同样的方法来过滤不同的数据,但没有结果。

如果我使用 pandas.Series.nuniquelambda x: x.nunique() 它计算唯一值并且它工作正常。但是,如何使用 pandas aggregate 方法获取唯一值?

为了完成这项工作,我编写了一个带有 for 循环 的函数,该函数将列名作为参数。不过,我希望这可以有更好的方法。

最佳答案

错误:

发生这种情况是因为 pandas.Series.unique 返回一个唯一值数组,agg 将其解释为尝试将不同的值广播到不同的行,因此被拒绝。对于返回 pandas SeriesIndex 的函数,您会遇到同样的错误。

解决方案:

如果你传递后面使用的函数,pandas.Series.nunique,

params = {
'A': 'sum',
'B': 'sum',
'C': 'count',
'D': 'sum',
'F': pd.Series.nunique
}

df.groupby('E').agg(params).reset_index()
Out[69]:
E C F A B D
0 1001 10 2 500 463 595
1 1002 10 2 484 493 348
2 1003 10 1 507 400 479
...
17 1018 10 1 606 454 410
18 1019 10 2 537 522 724
19 1020 10 2 541 532 486

它应该可以正常工作。

如果您想要唯一值本身,您可以将 lambda 函数提供给 agg,只要它将返回值识别为聚合值/而不是 SeriesIndexnp.ndarray 或子类。

例如:

params = {
'A': 'sum',
'B': 'sum',
'C': 'count',
'D': 'sum',
'F': lambda x: ','.join(sorted(pd.Series.unique(x)))
}

df.groupby('E').agg(params).reset_index()
Out[82]:
E C F A B D
0 1001 10 c,d 500 463 595
1 1002 10 a,b 484 493 348
2 1003 10 b 507 400 479
...
17 1018 10 b 606 454 410
18 1019 10 a,b 537 522 724
19 1020 10 c,d 541 532 486

或者,有点傻:

params = {
'A': 'sum',
'B': 'sum',
'C': 'count',
'D': 'sum',
'F': lambda x: pd.DataFrame(pd.Series.unique(x))
}

df.groupby('E').agg(params).reset_index()
Out[92]:
E C F A B D
0 1001 10 0
0 c
1 d 500 463 595
1 1002 10 0
0 b
1 a 484 493 348
2 1003 10 0
0 b 507 400 479
...
17 1018 10 0
0 b 606 454 410
18 1019 10 0
0 a
1 b 537 522 724
19 1020 10 0
0 d
1 c 541 532 486

关于python - 如何使用聚合方法从 Pandas 系列中获取唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850760/

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