Подтвердить что ты не робот

Переименование имен столбцов в Pandas Функция Groupby

1). У меня есть следующий примерный набор данных:

>>> df
    ID     Region  count
0  100       Asia      2
1  101     Europe      3
2  102         US      1
3  103     Africa      5
4  100     Russia      5
5  101  Australia      7
6  102         US      8
7  104       Asia     10
8  105     Europe     11
9  110     Africa     23

Я хотел сгруппировать наблюдения этого набора данных по ID области и суммировать подсчет для каждой группы. Поэтому я использовал что-то вроде этого:

>>> print(df.groupby(['ID','Region'],as_index=False).count.sum())

    ID     Region  count
0  100       Asia      2
1  100     Russia      5
2  101  Australia      7
3  101     Europe      3
4  102         US      9
5  103     Africa      5
6  104       Asia     10
7  105     Europe     11
8  110     Africa     23

При использовании as_index = False я могу получить вывод "Sql-Like". Моя проблема в том, что я не могу переименовать счетчик совокупной переменной здесь. Так что в Sql, если захотите сделать выше, я бы сделал что-то вроде этого:

select ID, Region, sum(count) as Total_Numbers
from df
group by ID,Region
order by ID, Region

Как мы видим, мне очень легко переименовать агрегированную переменную 'count' в Total_Numbers в SQL. Я хотел сделать то же самое в Pandas, но не смог найти такую ​​опцию в функции groupby. Может ли кто-нибудь помочь?

2). Второй вопрос и больше наблюдений заключается в том, что можно напрямую использовать имена столбцов в Pandas функции dataframe без их включения внутри кавычек? Я понимаю, что имена переменных являются строковыми, поэтому должны быть внутри кавычек, но я вижу, использует ли внешняя функция dataframe, и в качестве атрибута мы не требуем, чтобы они были внутри кавычек. Подобно df.ID.sum() и т.д. Это только когда мы используем его в функции DataFrame, такой как df.sort() или df.groupby, мы должны использовать ее внутри кавычек. Это на самом деле немного боль, как в SQL или на SAS или на другом языке, мы просто используем имя переменной без их цитирования. Любое предложение по этому поводу?

Просьба предложить по двум вышеуказанным пунктам (первый главный, второй - мнение).

Спасибо

4b9b3361

Ответ 1

Для первого вопроса, на мой взгляд, ответ будет:

<your DataFrame>.rename(columns={'count':'Total_Numbers'})

или

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']

Что касается второго, я бы сказал, что ответ будет отрицательным. Можно использовать его как 'df.ID' из python datamodel:

Ссылки на атрибуты переводятся в поисковые запросы в этом словаре, например, m.x эквивалентно m. dict [ "x" ]

Ответ 2

Текущий (начиная с версии 0.20) метод изменения имен столбцов после операции groupby заключается в цепочке метода rename. Подробнее см. это примечание об уклонении в документации.

Устаревший ответ на pandas версия 0.20

Это первый результат в google, и хотя верхний ответ работает, он действительно не отвечает на вопрос. Существует лучший ответ здесь и длинный обсуждение github о полной функциональности прохождения словарей к методу agg.

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

До того, как мы доберемся туда, создадим четыре столбца DataFrame.

df = pd.DataFrame({'A' : list('wwwwxxxx'), 
                   'B':list('yyzzyyzz'), 
                   'C':np.random.rand(8), 
                   'D':np.random.rand(8)})

   A  B         C         D
0  w  y  0.643784  0.828486
1  w  y  0.308682  0.994078
2  w  z  0.518000  0.725663
3  w  z  0.486656  0.259547
4  x  y  0.089913  0.238452
5  x  y  0.688177  0.753107
6  x  z  0.955035  0.462677
7  x  z  0.892066  0.368850

Скажем, мы хотим группировать по столбцам A, B и агрегировать столбец C с mean и median и агрегировать столбец D с помощью max. Следующий код будет делать это.

df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'})

            D         C          
          max      mean    median
A B                              
w y  0.994078  0.476233  0.476233
  z  0.725663  0.502328  0.502328
x y  0.753107  0.389045  0.389045
  z  0.462677  0.923551  0.923551

Это возвращает DataFrame с иерархическим индексом. Первоначальный вопрос задал вопрос о переименовании столбцов на том же шаге. Это возможно с помощью словаря словарей:

df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 
                            'D':{'D_max': 'max'}})

            D         C          
        D_max    C_mean  C_median
A B                              
w y  0.994078  0.476233  0.476233
  z  0.725663  0.502328  0.502328
x y  0.753107  0.389045  0.389045
  z  0.462677  0.923551  0.923551

Это переименовывает столбцы всего за один раз, но все же оставляет иерархический индекс, который верхний уровень можно отбросить с помощью df.columns = df.columns.droplevel(0).