Подсчет отличных с помощью панд группового не работает - PullRequest
0 голосов
/ 24 мая 2019

Все, что я пытаюсь сделать, это перебирать DataFrame и подсчитывать количество уникальных значений, используя группу панд по. Я также отсортировал фрейм данных безрезультатно.

Я испробовал 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 для каждого значения. Я чувствую, что упускаю что-то простое, но

В последнем столбце должна быть сумма столбца «count», сгруппированная по столбцу «query»

Ответы [ 4 ]

1 голос
/ 24 мая 2019

Вы хотите использовать метод преобразования

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

user_queries["query_counts"] = user_queries.groupby("queries")["count"].transform('nunique')
0 голосов
/ 25 мая 2019

Вы можете сделать это в одной группе:

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
0 голосов
/ 24 мая 2019

Если вы сгруппируете по всем столбцам, вы получите сгруппированные кадры данных, из которых вы можете извлечь длину каждой группы.

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)
0 голосов
/ 24 мая 2019

Это должно работать для вашего случая использования:

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
...