Группировка и только выбранные столбцы - PullRequest
0 голосов
/ 08 декабря 2018

Здесь я читаю файл "userdata.xlsx":

ID  Debt    Email   Age User
1   7.5 john@email.com  16  John
2   15  john@email.com  15  John
3   22  john@email.com  15  John
4   30  david@email.com 22  David
5   33  david@email.com 22  David
6   51  fred@email.com  61  Fred
7   11  fred@email.com  25  Fred
8   24  eric@email.com  19  Eric
9   68  terry@email.com 55  Terry
10  335 terry@email.com 55  Terry

Здесь я группируюсь по Пользователю, создаю электронную таблицу для каждого пользователя и выводю ее в виде своего собственного файла .xlsx, например:

ID  Debt    Email   Age User
1   7.5 john@email.com  16  John
2   15  john@email.com  15  John

Вот весь код:

    #!/usr/bin/env python3

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import xlrd

    df = pd.read_excel('userdata.xlsx')
    grp = df.groupby('User')

    for group in grp.groups:
        grouptofile = (grp.get_group(group))
        print(grouptofile)
        print(group)
        grouptofile.to_excel('%s.xlsx' % group , sheet_name='sheet1', index=False)

Теперь я хочу сохранить только выбранные столбцы для сохранения для каждого пользователя.Допустим, я хочу выбрать только столбцы «ID» и «Email».Я узнал, как выбирать только определенные столбцы, например:

selected = df[['ID','Email']]

Теперь я подумал, что имеет смысл добавить сюда идентификатор и адрес электронной почты.

grp = df.groupby('User')

Добавлены "Идентификатор" и "Электронная почта"

grp = df[['ID', 'Email']].groupby('User')

Можно ли даже объединить групповые значения и выбрать столбцы?

#!/usr/bin/env python3

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import xlrd

    df = pd.read_excel('userdata.xlsx')
    grp = df[['ID', 'Email']].groupby('User')

    for group in grp.groups:
        grouptofile = (grp.get_group(group))
        print(grouptofile)
        print(group)
        grouptofile.to_excel('%s.xlsx' % group , sheet_name='sheet1', index=False)

ЭтоОшибка при получении:

Traceback (most recent call last):
  File "/Users/Barry/Documents/Python/Pandas/exelscript.py", line 22, in <module>
    grp = df[['ID', 'Email']].groupby('User')
  File "/usr/local/lib/python3.7/site-packages/pandas/core/generic.py", line 6665, in groupby
    observed=observed, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 2152, in groupby
    return klass(obj, by, **kwds)
  File "/usr/local/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 599, in __init__
    mutated=self.mutated)
  File "/usr/local/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 3291, in _get_grouper
    raise KeyError(gpr)
KeyError: 'User'

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я думаю, вам нужно указать столбцы в подмножестве:

cols = ['ID', 'Email']
for i, group in df.groupby('User'):
    group[cols].to_excel('{}.xlsx'.format(i), sheet_name='sheet1', index=False)

Если получить KeyError: 'User', это означает, что вы хотите выбрать столбец, который не существует.

Так что, если выберите столбцы ID иEmail, тогда объединенный в цепочку groupby не может найти User столбец и вывести ошибку:

print (df[['ID', 'Email']])
   ID            Email
0   1   john@email.com
1   2   john@email.com
2   3   john@email.com
3   4  david@email.com
4   5  david@email.com
5   6   fred@email.com
6   7   fred@email.com
7   8   eric@email.com
8   9  terry@email.com
9  10  terry@email.com

Поэтому необходимо выбрать столбцы, которые также используются в groupby:

for i, group in df[['ID', 'Email', 'User']].groupby('User'):
    group.to_excel('{}.xlsx'.format(i), sheet_name='sheet1', index=False)

Или выбрать столбцы перед записьюподать как в первом решении.

for i, group in df[['ID', 'Email', 'User']].groupby('User'):
    group[cols].to_excel('{}.xlsx'.format(i), sheet_name='sheet1', index=False)
0 голосов
/ 08 декабря 2018

Это возможно ... но не совсем так, как вы это делаете.

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

(возможно,субоптимальный) пример:

grp = df[('ID', 'Email', 'User')].groupby('User')[('ID', 'Email')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...