如何在Python pandas中按多个变量分组并删除重复项
我有一个输入文件,里面有这样的数据:
**由于输入文件太大,我只需要取出唯一的配对 -
用户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