如何在groupby()之后找到不唯一的行数

时间:2018-10-27 18:28:31

标签: python pandas dataframe

我有一个具有两个功能的数据框dfID_ownerID_phone,我必须找到:

  1. 有多少人拥有超过n个电话。
  2. 电话在更多所有者之间共享,ID_phone有一个或多个ID_owner

为了回答第一个问题,我尝试了:

df.groupby('`ID_owner`')['`ID_phone'].nunique().to_frame()

似乎不起作用,因为我需要在分组后计算每个ID_owner的重复行数。我在第二个问题中遇到了同样的问题。

我想知道pandas中是否存在针对此类问题的特定方法或功能。

第一个问题的输出应为包含两列的数据框:一列显示ID_owner,第二列显示ID_owner拥有的智能手机数量。

2 个答案:

答案 0 :(得分:1)

尽管您似乎想保留聚合表,但您似乎过早地对表进行了切片。为了回答您的第一个问题,以下代码将起作用。

n = 2

(df.groupby('ID_owner').agg({'ID_phone': pd.Series.nunique}).query('ID_phone > @n').shape[0]

要回答第二个问题,您可以颠倒上述查询中的ID,更改n,然后选择“ ID_phone”列。

答案 1 :(得分:0)

df1.groupby('ID_owner').agg({'ID_phone': 'unique'}).reset_index()

或者您可以使用以下方式

df1.groupby('User_owner').apply(lambda x:x.zipcode.unique()).reset_index()

这将为您提供输出:

    User_owner  zipcode
0   Dave        [34567]
1   Donald      [34353]
2   Jae         [12345]
3   Shankar     [23456, 22222]

但值得一提的是,您可以使用独特的功能:

df1.groupby('ID_owner').agg({'ID_phone': 'nunique'}).reset_index().rename(columns = {'zipcode':'count'})

df1.groupby('User_owner').apply(lambda x:x.zipcode.nunique()).reset_index(name ='count')

这将导致

    User_owner  count
0   Dave        1
1   Donald      1
2   Jae         1
3   Shankar     2