分组依据和仅选定的列

时间:2018-12-08 13:01:44

标签: python python-3.x pandas python-2.7

我在这里读取文件“ 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']]

我现在认为在此处添加ID和电子邮件是合理的。

grp = df.groupby('User')

添加了“ ID”和“电子邮件”

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

甚至可以组合groupby和select列吗?

#!/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 :(得分:1)

我认为您需要在子集中指定列:

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

如果获取KeyError: 'User',则意味着您要选择不存在的列。

因此,如果选择列IDEmail,则链接的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中使用select列:

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)

答案 1 :(得分:0)

有可能……但是你做的还不太清楚。

您正在有效地删除除两列之外的所有列,然后尝试按不再存在的第三列进行分组。相反,您需要在选择列之前进行分组(尽管我不知道在numpy中进行分组是否是一种变异操作,因此您可能需要先进行复制)。

(可能次优)示例:

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