gpt4 book ai didi

python - 分组依据这个或那个

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:53 26 4
gpt4 key购买 nike

请耐心等待这个问题,几个小时以来我一直在为此伤脑筋。

考虑这些数据

np.random.seed(2)
apples = np.random.randint(10,20,9)
df = pd.DataFrame({'name':list('aabbcdeee'), 'addr':list('mmznjjkkx'), 'apples':apples})[['name','addr','apples']]

name相同则为同一人,addr相同则为同一人。我想数一数每个人有多少个苹果。通常,这是微不足道的:

In [50]: df[['apples', 'name']].groupby('name').sum()
Out[50]:
apples
name
a 36
b 28
c 18
d 17
e 38

df[['apples', 'addr']].groupby('addr').sum() 因为它们应该返回相同的输出。但是,addr j 输入了她的名字 cd,而名字 b输入她的地址为 zne 两次正确输入地址但第三次搞砸了。结果,上述两个 groupby 操作都低估了一些人拥有的苹果数量。理想的输出是:

In [52]: %paste
pd.DataFrame({'name':list('aabbcceee'), 'addr':list('mmnnjjkkk'), 'apples':apples}).groupby('name').apples.sum()

## -- End pasted text --
Out[52]:
name
a 36
b 28
c 35
e 38
Name: apples, dtype: int32

我可以使用集合来识别具有错误地址或名称的索引:

sameNames = df.name[df.name.duplicated()].index
sameAddr = df.addr[df.addr.duplicated()].index
sameNameORaddr = df.name[(df.name.duplicated() | df.addr.duplicated())].index

所以错误在这里:

In [47]: sameNameORaddr.difference(sameNames).union(sameNameORaddr.difference(sameAddr))
Out[47]: Int64Index([2, 3, 4, 5, 8], dtype='int64')

但我不知道如何使用它来执行groupby。我正在考虑尝试分配可以正确识别重复名称或地址但无法弄清楚如何执行的新名称。任何帮助表示赞赏。

最佳答案

另一种方法:

df['group'] = df.groupby('addr').ngroup()

d = {'name':'first','apples':'sum'}
df1 = df.groupby('name',as_index=False).sum().groupby('group').agg(d)

df1 = df1.sort_values('name').reset_index(drop=True)

print (df1)

# Output:

name apples
0 a 36
1 b 28
2 c 35
3 e 38

说明:

第一次使用groupby.ngroupaddr col

中的每个组编号
df['group'] = df.groupby('addr').ngroup()

name addr apples group
0 a m 18 2
1 a m 18 2
2 b z 16 5
3 b n 12 3
4 c j 18 0
5 d j 17 0
6 e k 12 1
7 e k 11 1
8 e x 15 4

然后用名称和总和进行分组 df.groupby('name',as_index=False).sum() 它返回

   name  apples group
0 a 36 4
1 b 28 8
2 c 18 0
3 d 17 0
4 e 38 6

现在相同的地址行将具有相同的组号,因此您可以在 group 列上再次分组并使用 groupby.agg使用 apples = 'sum'name = first or last 来保留名称的第一个/最后一个实例。

d = {'name':'first','apples':'sum'}
df1 = df.groupby('name',as_index=False).sum().groupby('group').agg(d)

然后只需对值进行排序并重置索引即可获得输出。

关于python - 分组依据这个或那个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865020/

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