Pandas Dataframe Transformation. Применение нескольких арифметических операций одновременно - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть фрейм данных, который выглядит следующим образом: enter image description here

data = {
"Name": ["Brad Pitt", "Brad Pitt", "Brad Pitt", "Rowan Atkinson", "Leonardo DiCaprio", "Leonardo DiCaprio", 
          "Uma Thurman", "Uma Thurman", "John Travolta", "John Travolta", "Brad Pitt", "Brad Pitt", 
         "Leonardo DiCaprio", "Leonardo DiCaprio"], 
"Movie": ["Moneyball", "Moneyball", "Mr. & Mrs. Smith", "The Lion King", "Inception", "Inception",
          "Pulp fiction", "Pulp fiction", "Pulp fiction", "Pulp fiction", "Twelve Monkeys", "Twelve Monkeys",
          "Titanic", "Titanic"],
"Rating": [7, 7, 7.8, 9, 8.2, 8.2, 7.9, 7.9, 7.9, 7.9, 8, 8, 9.1, 9.1], 
"Votes": [70, 70, 120, 150, 110, 110, 85, 85, 85, 85, 60, 60, 170, 170],
"Genre": ["Biography", "Drama", "Comedy", "Animation", "Action", "Thriller", 
          "Crime", "Drama", "Crime", "Drama", "Mystery", "Triller", 
          "Drama", "Romance"]
    }
import pandas as pd
films = pd.DataFrame(data)
films

Я хочу применить несколько операций, чтобы это выглядело так:

В 1) Фильмы, которые я поставил movies.count () для каждого актера, 2) Рейтинг становится средним рейтингом уникальных фильмов и 3) Голоса суммируются за уникальные фильмы актером.

enter image description here

Пожалуйста, помогите выяснить, как сделать это преобразование. Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

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

%timeit films.drop_duplicates(['Movie', 'Name']).groupby(['Name']).agg({'Movie' : 'count', 'Rating' : 'mean', 'Votes' : 'sum'})
2.55 ms ± 122 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


%timeit films.groupby(["Name", "Movie"]).first().reset_index().groupby("Name").agg({"Movie": "count", "Rating": "mean", "Votes": "sum"})
6.92 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


                   Movie    Rating  Votes
Name            
Brad Pitt           3       7.60    250
John Travolta       1       7.90    85
Leonardo DiCaprio   2       8.65    280
Rowan Atkinson      1       9.00    150
Uma Thurman         1       7.90    85
0 голосов
/ 06 сентября 2018

Сначала вы можете сгруппировать по Имени и Фильму, чтобы удалить дубликаты, а затем просто сгруппировать по Имени, чтобы собрать остальные:

In [25]: films.groupby(["Name", "Movie"]).first().reset_index().groupby("Name")
    ...: .agg({"Movie": "count", "Rating": "mean", "Votes": "sum"})
Out[25]:
                   Movie  Rating  Votes
Name
Brad Pitt              3    7.60    250
John Travolta          1    7.90     85
Leonardo DiCaprio      2    8.65    280
Rowan Atkinson         1    9.00    150
Uma Thurman            1    7.90     85
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...