您好我是Python的新手并尝试过搜索,但未成功。
我有一个包含内容的excel文件,如下所示
employee_number email System
807 marg.prent@test.com System1
8304 bill.riley@test.com System1
10441 doug.wever@test.com System1
12374 Rich.flipt@test.com System2
14012 doug.wever@test.com System2
15906 marg.prent@test.com System2
16223 mark.johns@test.com System3
82189 doug.wever@test.com System3
86099 krish.ragg@test.com System3
86646 marg.prent@test.com System4
87165 doug.wever@test.com System4
87844 jose.taver@test.com System4
88165 doug.wever@test.com System5
87944 jared.Rich@test.com System5
87944 John.taver@test.com System5
如果一名员工在3个以上的系统中,我希望将其从原始数据框中删除,并为这些员工及其所在的系统创建一个新的dataFrame。
到目前为止,我有:
`import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
df = pd.read_excel('file.xlsx')
EmailSysList = df[['email','System']]
for x in EmailSysList['email']:
if EmailSysList['System'] == "System 1 ":
我明白这不是很多,可能是完全错误的方法,但如果有人能指出我正确的方向,那将非常感激
答案 0 :(得分:1)
所以可能有很多方法可以在这里提出解决方案。我将transform
与groupby
一起使用。
让我们首先过滤数据框,以获取超过3个系统的用户。既然你说没有重复,我们可以简单地使用计数!
more_than_3 = df1[df1.groupby('email')['email'].transform('count') > 3].sort_values(['email', 'System'])
# sort values is just making the output more readable and put everything in order.
# output below
employee_number email System
2 10441 doug.wever@test.com System1
4 14012 doug.wever@test.com System2
7 82189 doug.wever@test.com System3
10 87165 doug.wever@test.com System4
12 88165 doug.wever@test.com System5
然后我们简单地颠倒其他人的逻辑:
others = df1[df1.groupby('email')['email'].transform('count') <= 3].sort_values(['email', 'System'])
# output
employee_number email System
14 87944 John.taver@test.com System5
3 12374 Rich.flipt@test.com System2
1 8304 bill.riley@test.com System1
13 87944 jared.Rich@test.com System5
11 87844 jose.taver@test.com System4
8 86099 krish.ragg@test.com System3
0 807 marg.prent@test.com System1
5 15906 marg.prent@test.com System2
9 86646 marg.prent@test.com System4
6 16223 mark.johns@test.com System3
要将这些数据框发送到Excel,您可以使用pd.to_excel()
。此外,如果您在同一工作簿中需要它们,请使用sheetname
参数。
答案 1 :(得分:0)
groupby和count()为您提供所需的电子邮件,然后您可以使用该系列分割初始DataFrame。
morethan3emails = (df.groupby('email', as_index=False)
.System
.count()
.query('System > 3')
.email)
morethan3df = df[df.email.isin(morethan3emails)]
lessthan4df = df[~df.email.isin(morethan3emails)]