Поиск среднего значения по группам и отображение всей информации - PullRequest
1 голос
/ 07 февраля 2020

у меня есть этот фрейм данных.

df1 = pd.DataFrame({'userId': [1,1,1,2,2,3,4,4],
                   'movieId': [500,600,700,1100,1200,600,600,1900],  
                   'ratings': [3.5,4.5,2.0,5.0,4.0,4.5,5.0,3.5]})


df2 = pd.DataFrame({'userId':[1,1,2,3,4,5],
                    'movieId':[500,600,1100,800,900,600],
                    'tag':['Highly quotable','Boxing story','MMA','Tom Hardy','Fun','long movie']})


frames = [df1, df2]
result = pd.concat(frames, sort = False)
result

  userId movieId ratings tag
0   1    500     3.5    NaN
1   1   600      4.5    NaN
2   1   700      2.0    NaN
3   2   1100     5.0    NaN
4   2   1200     4.0    NaN
5   3   600      4.5    NaN
6   4   600      5.0    NaN
7   4   1900     3.5    NaN
0   1   500      NaN    Highly quotable
1   1   600      NaN    Boxing story
2   2   1100     NaN    MMA
3   3   800      NaN    Tom Hardy
4   4   900      NaN    Fun
5   5   600      NaN    long movie

Я пытаюсь группировать movieId. То, что я хочу, это подсчитать количество вхождений для каждого движения ie. Если число равно 2 или более 2, для этого сценария следует взять среднее значение ratings и отобразить всю информацию. Я пробовал это, но это дает ошибку. KeyError: 'ratings'.

Вот код

group = result.groupby('movieId')['movieId'].count().reset_index(name="count")
agg = group['ratings'].mean().reset_index(name="mean")
agg
#right code here

1 Ответ

1 голос
/ 07 февраля 2020

Я предложу что-то другое. Я не буду использовать concat, вместо этого я буду использовать pd.merge

Проверьте это:

import pandas as pd

df1 = pd.DataFrame({'userId': [1,1,1,2,2,3,4,4],
                   'movieId': [500,600,700,1100,1200,600,600,1900],
                   'ratings': [3.5,4.5,2.0,5.0,4.0,4.5,5.0,3.5]})


df2 = pd.DataFrame({'userId':[1,1,2,3,4,5],
                    'movieId':[500,600,1100,800,900,600],
                    'tag':['Highly quotable','Boxing story','MMA','Tom Hardy','Fun','long movie']})

# Merging df1 and df2, now you'll not have unnecessary NaN Values
result = df1.merge(df2[['movieId', 'tag']], on='movieId', how='left')

# Grouping by using two tipes of output with agg
result.groupby(by=['movieId', 'tag'], as_index=False).agg({'ratings': ['count', 'mean']})

Вывод будет:

  movieId              tag ratings          
                             count      mean
0     500  Highly quotable       1  3.500000
1     600     Boxing story       3  4.666667
2     600       long movie       3  4.666667
3    1100              MMA       1  5.000000

Надеюсь, что это работает для вас

Редактировать

Как вы спросили в комментариях, если вы хотите отфильтровать фрейм данных, вы можете просто запустить код ниже:

# Removing multiindex columns (just to be easier for you)
result = result.droplevel(0, axis=1)
result.columns = ['userId', 'movieId', 'ratings_count', 'ratings_mean']

# Filtering
result = result[result['ratings_count'] >= 2]
result = result[result['ratings_mean'] >= 3]

Есть лучшие способы сделать это, но я предполагаю, что вы еще не знаете, как работать с Pandas MultiIndex, поэтому я сделал простое решение.

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