(Python) Как мне сравнить 2 или более столбца с Pandas? - PullRequest
0 голосов
/ 16 июня 2020

Я использовал модуль pandas для очистки данных, и хотя я понял, как это сделать (), я все еще не уверен, как я могу сравнить 2 или более столбца CSV. Взяв в качестве примера приведенный ниже код, я хотел выяснить, например, 3 издателя, которые отдельно опубликовали больше игр Action, Shooter и Platform. Я написал приведенный ниже код, но на выходе вместо названия жанра отображается «False». По крайней мере, я считаю, что 3 лучших издателя правы, но я не уверен. Может ли кто-нибудь взглянуть?

import pandas as pd

data = pd.read_csv("https://sites.google.com/site/dr2fundamentospython/arquivos/Video_Games_Sales_as_at_22_Dec_2016.csv")

a = data['Publisher'].groupby((data['Genre'] == 'Action')).value_counts().head(3)
print(a)

s = data['Publisher'].groupby((data['Genre'] == 'Shooter')).value_counts().head(3)
print(s)

p = data['Publisher'].groupby((data['Genre'] == 'Platform')).value_counts().head(3)
print(p)

Кроме того, я должен найти 3 лучших издателя, которые вместе продали больше всего экшенов, шутеров и платформеров. Я пытался написать это, но не получилось. Как я могу использовать 3 элемента одного столбца одновременно и сравнивать их с другими 2 столбцами? А что, если я хочу включить временные рамки, например, сравнить все эти столбцы за последние 10 лет?

import pandas as pd

data = pd.read_csv("https://sites.google.com/site/dr2fundamentospython/arquivos/Video_Games_Sales_as_at_22_Dec_2016.csv")

a = ((data['Genre'] == 'Action') & (data['Genre'] == 'Shooter') & (data['Genre'] == 'Platform')).groupby((data['Publisher']) & (data['Global_Sales'])).value_counts().head(3)
print(a)

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Для первых 3 вы можете сделать это:

data = pd.read_csv("https://sites.google.com/site/dr2fundamentospython/arquivos/Video_Games_Sales_as_at_22_Dec_2016.csv")

a = data[data['Genre']=='Action'].groupby(by=['Publisher', 'Genre'], as_index=False).size().reset_index(name='count').sort_values('count', ascending=False)
print(a.head(3))

s = data[data['Genre']=='Shooter'].groupby(by=['Publisher', 'Genre'], as_index=False).size().reset_index(name='count').sort_values('count', ascending=False)
print(s.head(3))

s = data[data['Genre']=='Platform'].groupby(by=['Publisher', 'Genre'], as_index=False).size().reset_index(name='count').sort_values('count', ascending=False)
print(s.head(3))

Вывод:

              Publisher   Genre  count
10           Activision  Action    311
148  Namco Bandai Games  Action    251
214             Ubisoft  Action    198

           Publisher    Genre  count
5         Activision  Shooter    162
39   Electronic Arts  Shooter    145
135          Ubisoft  Shooter     92

   Publisher     Genre  count
60  Nintendo  Platform    112
81       THQ  Platform     85
86   Ubisoft  Platform     70

А для последнего вы можете сделать это:

all = data[(data['Genre']=='Platform') | (data['Genre']=='Shooter') | (data['Genre']=='Action')].groupby(by=['Publisher'], as_index=False).agg({'Global_Sales': 'sum'}).reset_index(drop=['index']).sort_values('Global_Sales', ascending=False)
print(all.head(3))

Вывод:

           Publisher  Global_Sales
195         Nintendo        623.24
11        Activision        480.94
84   Electronic Arts        287.13
1 голос
/ 16 июня 2020

Это сразу много вопросов:

  1. a = data['Publisher'].groupby((data['Genre'] == 'Action')).value_counts().head(3) print(a)

В группе вы делаете не указывать конкретный жанр, например «Экшн». Вот для чего нужен запрос. Задача groupby - выполнить следующие вычисления для каждые Жанр

In [11]: number_of_games = data.groupby('Genre')['Publisher'].value_counts()                                                                                                                                                        
Out[11]: 
Genre     Publisher              
Action    Activision                 311
          Namco Bandai Games         251
          Ubisoft                    198
          THQ                        194
          Electronic Arts            183
                                    ... 
Strategy  Time Warner Interactive      1
          Titus                        1
          Trion Worlds                 1
          Westwood Studios             1
          Zoo Digital Publishing       1
Name: Publisher, dtype: int64

Обратите внимание, что выбор издателя выполняется после группировки, поэтому внутренне pandas перебирает все значения в жанре. и делает value_count для Publisher

Мне нужно найти 3 лучших издателя, которые продали больше всего экшенов, шутеров и платформеров

Просто отфильтруйте те категории, которые вам нравятся это

In [25]: number_of_games.loc[['Action', 'Shooter', 'Platform'], :]                                                                                                                                                 
Out[25]: 
Genre    Publisher         
Action   Activision            311
         Namco Bandai Games    251
         Ubisoft               198
         THQ                   194
         Electronic Arts       183
                              ... 
Shooter  Visco                   1
         Warashi                 1
         Wargaming.net           1
         Xseed Games             1
         id Software             1
Name: Publisher, dtype: int64

Затем вам снова нужны 3 крупнейших издателя для каждого жанра , и поэтому вы используете другую группу

In [30]: number_of_games.loc[['Action', 'Shooter', 'Platform'], :].groupby(['Genre']).head(3)                                                                                                                      
Out[30]: 
Genre     Publisher         
Action    Activision            311
          Namco Bandai Games    251
          Ubisoft               198
Platform  Nintendo              112
          THQ                    85
          Ubisoft                70
Shooter   Activision            162
          Electronic Arts       145
          Ubisoft                92
Name: Publisher, dtype: int64

Функция head неявно полагается на значения сортируются. В качестве альтернативы вы можете использовать nlargest

In [31]: number_of_games.loc[['Action', 'Shooter', 'Platform'], :].groupby(['Genre']).nlargest(3).droplevel(0)                                                                                                     
Out[31]: 
Genre     Publisher         
Action    Activision            311
          Namco Bandai Games    251
          Ubisoft               198
Platform  Nintendo              112
          THQ                    85
          Ubisoft                70
Shooter   Activision            162
          Electronic Arts       145
          Ubisoft                92
Name: Publisher, dtype: int64

Результат тот же, но вам нужно будет очистить индекс с помощью droplevel, так как он появлялся дважды

А что, если я хочу включить временные рамки, например, сравнить все эти столбцы за последние 10 лет?

Очевидно, вы бы нужны данные за таймфрейм. Если вы хотите, чтобы игры были опубликованы только за последние 10 лет, отфильтруйте исходные данные для игр старше 10 лет. Если вы хотите определить, какие издатели публикуют больше всего каждый год, вы должны создать столбец с годом публикации и сгруппировать по нему. Вы уже видели, что с помощью Genre и Publisher можно группировать по списку функций.

0 голосов
/ 16 июня 2020

Для первого сомнения вы можете ввести код:

import pandas as pd

data = pd.read_csv("https://sites.google.com/site/dr2fundamentospython/arquivos/Video_Games_Sales_as_at_22_Dec_2016.csv")

# Group data in Genres
grouped_data = data['Publisher'].groupby((data['Genre'])).value_counts()

# By know you already have the values you want inside the "grouped_data"
# But, you can create smaller tables to see it better

a = grouped_data['Action']
s = grouped_data['Shooter']
p = grouped_data['Platform']

Во втором вопросе я не получил именно то, что вам нужно. Но вы можете сравнить издателя и жанра, используя:

import pandas as pd

data = pd.read_csv("https://sites.google.com/site/dr2fundamentospython/arquivos/Video_Games_Sales_as_at_22_Dec_2016.csv")

# group data by Publisher and Genre using .sum() for getting total sales
grouped_2 = data.groupby((data['Publisher'], data['Genre'])).sum()

# Look for a specific Publisher x Genre
specific = grouped_2.loc['Nintendo', 'Sports']
print(specific)

# For making the analysis for last 10 years
Recent_data = data[data['Year_of_Release']>2010]

# Now, you can replace "data" for "Recent_data" and make the same analysis for the last 10 years.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...