如何在Python pandas中按多个变量分组并删除重复项

3 投票
4 回答
7997 浏览
提问于 2025-04-18 08:39

我有一个输入文件,里面有这样的数据:

**由于输入文件太大,我只需要取出唯一的配对 -

用户ID-位置ID (某种预处理)**

userID locationID
     1       loc1 
     1       loc2 
     1       loc3 
     2       loc1 
     3       loc4 
     3       loc3 
     3       loc1

我需要找出每个位置上有多少不同的用户被检查过,并且要得到一个新列来显示这些值。我之前尝试过这样做,但结果并不是我想要的。

DataFrame({'count': df.groupby(["userID","locationID",]).size()}).reset_index()

4 个回答

0

解决方案:

df.groupby(['locID']).size()

返回结果:

locID
loc1     3
loc2     1
loc3     2
loc4     1

自己试试:

import pandas

txt = '''userID  locationID
 1         loc1 
 1         loc2 
 1         loc3 
 2         loc1 
 3         loc4 
 3         loc3 
 3         loc1'''


listtxt = list(txt.splitlines())
columns = tuple(filter(None, listtxt.pop(0).split()))
vals = [tuple(filter(None, line.split())) for line in listtxt]
df = pandas.DataFrame(vals, columns=columns)

df 现在返回:

  userID locationID
0      1       loc1
1      1       loc2
2      1       loc3
3      2       loc1
4      3       loc4
5      3       loc3
6      3       loc1

还有

df.groupby(['locationID']).size()

返回结果:

locationID
loc1          3
loc2          1
loc3          2
loc4          1
0
import pandas as pn

df = pn.DataFrame({'userId': pn.Series([1,1,1,2,3,3,3]),        
                  'locID': pn.Series(['loc1', 'loc2', 'loc3', 'loc1', 'loc4', 'loc3','loc1'])})     
print df.groupby(['locID']).count().userId

输出:

locID       
loc1        3
loc2        1
loc3        2
loc4        1
3

这应该是你想要的,但我不确定有没有更简单的方法:

In [5]: df.groupby(['locID','userId']).last().groupby(level='locID').size()
Out[5]: 
locID
loc1     3
loc2     1
loc3     2
loc4     1
dtype: int64

取每组的最后一个会去掉重复的项。

3

这里有一个专门用来处理这个问题的方法,叫做 nunique,它属于Series(分组)的方法。

In [11]: df  # Note the duplicated row I appended at the end
Out[11]:
   userID locationID
0       1       loc1
1       1       loc2
2       1       loc3
3       2       loc1
4       3       loc4
5       3       loc3
6       3       loc1
7       3       loc1

In [12]: g = df.groupby('locationID')

In [13]: g['userID'].nunique()
Out[13]:
locationID
loc1          3
loc2          1
loc3          2
loc4          1
dtype: int64

撰写回答