[英]Counting distinct using pandas groupby not working
我要做的就是遍歷DataFrame並使用pandas group來計數唯一值的數量。 我還對數據框進行了排序,但無濟於事。
我嘗試了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。 我覺得我缺少一些簡單的東西,但是
最后一列應具有按列“查詢”分組的“計數”列的總和
您要使用轉換方法
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html
user_queries["query_counts"] = user_queries.groupby("queries")["count"].transform('nunique')
這應該適合您的用例:
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
如果按所有列分組,則將獲得分組的數據幀,從中可以提取每個分組的長度。
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)
您可以在單個groupby中執行此操作:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.