Уникальные значения Pandas в виде столбцов с подсчетами

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Работа с фреймом данных pandas и попытка перевернуть его в сгруппированном выводе, который принимает уникальные значения и помещает их в виде столбца, и соответствующие значения для каждого в качестве значений в новом фрейме данных.

Вот начальный фрейм данных:

 df = pd.DataFrame([('gold', 'bronze', 'silver'),
                   ('silver', 'gold', 'bronze'),
                   ('gold', 'silver', 'bronze'),
                   ('bronze', 'silver', 'gold')],
                    columns=('Canada', 'China', 'South Korea'))
df.head()

    Canada  China   South Korea
0   gold    bronze  silver
1   silver  gold    bronze
2   gold    silver  bronze
3   bronze  silver  gold
  

Желаемый результат будет выглядеть следующим образом:

     nation      gold    silver  bronze
0   Canada        2          1       1
1   China         1          2       1
2   South Korea   1          1       2
  

Ответ №1:

Вы можете использовать df.apply с pd.value_counts *

 df.apply(pd.value_counts).T

             bronze  gold  silver
Canada            1     2       1
China             1     1       2
South Korea       2     1       1
  

* Я не нашел документации pd.value_counts , так что ссылка на github связана с функцией.

РЕДАКТИРОВАТЬ: при чтении исходного кода pd.Series.value_counts просто вызывает pd.value_counts

Ответ №2:

Используйте pd.get_dummies и sum

 pd.get_dummies(df.T, prefix='',prefix_sep='').sum(level=0,axis=1)

Out[995]:
             bronze  gold  silver
Canada            1     2       1
China             1     1       2
South Korea       2     1       1
  

Ответ №3:

 w = df.melt()

    variable    value
0   Canada      gold
1   Canada      silver
2   Canada      gold
3   Canada      bronze
4   China       bronze
5   China       gold
6   China       silver
7   China       silver
8   South Korea silver
9   South Korea bronze
10  South Korea bronze
11  South Korea gold
  

и затем:

 pd.crosstab(w['variable'],w['value'])
  

желаемый результат:

 value        bronze gold    silver
variable            
Canada        1      2       1
China         1      1       2
South Korea   2      1       1
  

Ответ №4:

 df = pd.DataFrame([('gold', 'bronze', 'silver'),
               ('silver', 'gold', 'bronze'),
               ('gold', 'silver', 'bronze'),
               ('bronze', 'silver', 'gold')],
                columns=('Canada', 'China', 'South Korea')).transpose()

df.apply(pd.value_counts,axis=1)
  

Комментарии:

1. Небольшое объяснение того, как работает этот код, моя помощь