使用Pandas Groupby计算不重复计数不起作用

时间:2019-05-24 19:53:39

标签: python pandas count distinct

我想要做的就是遍历DataFrame并使用pandas group by计算唯一值的数量。我还对数据框进行了排序。

我尝试了15种不同的方法,并且阅读了我能找到的每个问题/响应线程,我也不知道为什么它不起作用。

创建DF的代码:

#list of queries is literally a python list of queries in no specified #order

user_queries = pd.DataFrame(list_of_queries)

user_queries = user_queries.rename(index=str, columns={0: "queries"})
# I only added the int 1 because pandas refused to just count the #queries themselves
user_queries["count"] = 1

分组代码之前的样子

      queries  count

1234      test         1
1234      test         1  

user_queries["query_counts"] = user_queries.groupby("queries")["count"].nunique()
user_queries.head()

应该是什么样子

|    ,queries,count,query_counts|
|1234,test   ,1    ,2           |

但是它不是“ 2”,而是给我每个值的NaN。我觉得我缺少一些简单的东西,但是

最后一列应将“计数”列的总和与“查询”列分组

4 个答案:

答案 0 :(得分:1)

您要使用转换方法

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html

user_queries["query_counts"] = user_queries.groupby("queries")["count"].transform('nunique')

答案 1 :(得分:0)

这应该适合您的用例:

import pandas as pd
import numpy as np

queries = [
    (1233, np.nan),
    (1234, 'test'),
    (1235, 'test'),
    (1236, 'foo'),
    (1237, 'bar'),
]

df = pd.DataFrame(queries, columns=['id', 'query'])
print(df.groupby('query')['id'].count())

输出:

query
bar     1
foo     1
test    2
Name: id, dtype: int64

答案 2 :(得分:0)

如果按所有列分组,则将获得分组的数据帧,从中可以提取每个分组的长度。

grouped = user_queries.groupby(["queries","count"])
res = None
for group_name, df in grouped:
    df['query_counts'] = int(df.shape[0])
    if res==None:
        res = df.iloc[:1]
    else:
        res = pd.concat([res,df.iloc[0:1]])

print(res)

答案 3 :(得分:0)

您可以在一个分组中进行以下操作:

In [11]: df.groupby([df.index, "queries", "count"]).size()
Out[11]:
      queries  count
1234  test     1        2
dtype: int64

In [12]: df.groupby([df.index, "queries", "count"]).size().reset_index(name="query_count")
Out[12]:
   level_0 queries  count  query_count
0     1234    test      1            2

In [13]: df.groupby(["queries", "count"]).size()
Out[13]:
queries  count
test     1        2
dtype: int64

In [14]: df.groupby(["queries", "count"]).size().reset_index(name="query_count")
Out[14]:
  queries  count  query_count
0    test      1            2