我在这里读取文件“ 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'
答案 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'
,则意味着您要选择不存在的列。
因此,如果选择列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中使用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')]