我想要做的就是遍历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。我觉得我缺少一些简单的东西,但是
最后一列应将“计数”列的总和与“查询”列分组
答案 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