【发布时间】:2019-03-22 17:33:30
【问题描述】:
请耐心等待,我已经为此烦恼了好几个小时。
考虑这些数据
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(),因为它们应该返回相同的输出。
但是,地址j输入了她的名字c和d,而名字b输入了她的地址z和n,而e输入了两次正确的地址但第三次搞砸了。结果,上述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。我正在考虑尝试分配可以正确识别重复名称或地址但无法弄清楚如何做到这一点的新名称。任何帮助表示赞赏。
【问题讨论】:
标签: python pandas group-by conditional-statements pandas-groupby