【问题标题】:Groupby and only selected ColumnsGroupby 和仅选定的列
【发布时间】:2018-12-08 13:01:44
【问题描述】:

我在这里读取文件“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”和“Email”

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

甚至可以组合 groupby 和选择列吗?

#!/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'

【问题讨论】:

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


    【解决方案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 中使用:

    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)
    

    【讨论】:

    • 工作方式与之前的代码相同。但它仍然输出所有列,而不仅仅是“ID”和“Email”。
    • 谢谢哥们,如果你有时间能解释一下吗?只是为了让像我这样的菜鸟非常清楚
    • @Barry - 当然,没问题 :)
    【解决方案2】:

    有可能……但不完全是你的做法。

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

    (可能次优)示例:

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

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 2021-11-07
      • 2017-02-26
      • 2018-10-01
      • 2014-08-30
      • 2017-07-24
      相关资源
      最近更新 更多