[英]Pandas: get first occurrence and ignore if in any other column on same day
新手来了
鉴于以下文件,我试图计算不同值出现的次数。 这些数据是针对每天的多个设施的,因此无法获得正确的总数。
尝试将 nunique 与 groupby 结合使用,但无法获得逻辑。
df1 = df.groupby(['Date', 'Facility'], as_index=False)['By_Name'].nunique()
给定日期的样本输入(Sample.xlsx) [实际数据是一个月中的每一天]:
日期 | 设施 | 开始时间 | 按名字 | 导师 | 院长 | 循环器 |
---|---|---|---|---|---|---|
2021-09-10 | 恐惧角 | 10:01 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 10:31 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 10:36 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 11:58 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 12:11 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 12:56 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 13:35 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 17:30 | DI | 吉隆坡 | ||
2021-09-10 | 恐惧角 | 09:50 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 10:47 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 11:14 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 16:18 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 16:34 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 18:09 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 18:20 | 吉隆坡 | DI | ||
2021-09-10 | 恐惧角 | 09:30 | 协议书 | WH | ||
2021-09-10 | 恐惧角 | 09:48 | SR | JR | ||
2021-09-10 | 恐惧角 | 11:03 | SR | JR | ||
2021-09-10 | 恐惧角 | 12:10 | SR | JR | ||
2021-09-10 | 恐惧角 | 13:10 | SR | JR | ||
2021-09-10 | 恐惧角 | 13:34 | SR | JR | ||
2021-09-10 | 恐惧角 | 13:55 | SR | JR | ||
2021-09-10 | 恐惧角 | 16:19 | SR | JR | ||
2021-09-10 | 恐惧角 | 16:19 | SR | JR | ||
2021-09-10 | 恐惧角 | 16:43 | SR | JR | ||
2021-09-10 | 恐惧角 | 16:43 | SR | JR | ||
2021-09-10 | 恐惧角 | 17:09 | SR | JR | ||
2021-09-10 | 恐惧角 | 11:52 | WH |
期望输出(按设施)
日期 | 设施 | 参赛作品 | 开始时间 | 按名字 | 导师 | 院长 | 循环器 |
---|---|---|---|---|---|---|---|
2021-09-10 | 恐惧角 | 6 | 09:30 | 协议书 | WH | ||
2021-09-10 | 恐惧角 | 09:48 | SR | JR | |||
2021-09-10 | 恐惧角 | 09:50 | 吉隆坡 | DI | |||
2021-09-10 | 恐惧角 | 10:01 | DI | 吉隆坡 |
任何和所有的帮助将不胜感激。 TIA
更新答案:
根据 OP 在评论中的澄清,这是一个获得所需内容的新策略:
df = df.set_index(['Date', 'Facility', 'Begin Time']).stack()
df.index=df.index.droplevel(3)
df = df.to_frame().rename(columns={0:'Name'}).reset_index()
df2 = df.groupby(['Date', 'Facility'])['Name'].nunique().to_frame().rename(columns={'Name': 'Entries'})
indexCols = ['Date', 'Facility', 'Entries']
df = df.join(df2, on=['Date', 'Facility']).reindex(columns=indexCols + list(set(df.columns) - set(indexCols)))
df = df.assign(TEMP_COL=0).groupby(indexCols + ['Name']).nth(0).drop(columns='TEMP_COL')
解释:
Date, Facility, Begin Time
作为索引,调用stack()
将包含名称的四列重新排列为单个列,并将旧列名称指示“名称类型”( By Name, Preceptor, Preceptee
或Circulator
)添加为级别行多索引。0
列重命名为Name
,调用reset_index()
将Date, Facility, Begin Time
移出多索引行并返回到列标签中。groupby()
和nunique()
计算Entries
:与每个Date, Facility
关联的唯一名称的数量(跨越所有四个原始列)。join()
将Entries
列添加到原始数据框。Date, Facility, Name
上使用groupby()
,然后使用nth(0)
来获取每个组的第一行(包括其Begin Time
),还使用虚拟列TEMP_COL
来确保我们不会用完列执行groupby()
。示例 1 (使用问题的原始输入):
输出:
Begin Time
Date Facility Entries Name
2021-09-10 Cape Fear 6 DI 10:01
JR 09:48
KL 10:01
LOA 09:30
SR 09:48
WH 09:30
示例 2 (添加第二个Facility
):
Date Facility Begin Time By Name Preceptor Preceptee Circulator
0 2021-09-11 Facility Two 10:01 AA <NA> <NA> ZZ
1 2021-09-11 Facility Two 10:31 AA <NA> <NA> ZZ
2 2021-09-11 Facility Two 10:36 AA <NA> <NA> ZZ
3 2021-09-11 Facility Two 11:58 DI <NA> <NA> KL
4 2021-09-11 Facility Two 12:11 DI <NA> <NA> KL
5 2021-09-11 Facility Two 12:56 DI <NA> <NA> KL
6 2021-09-11 Facility Two 13:35 DI <NA> <NA> KL
7 2021-09-10 Cape Fear 10:01 DI <NA> <NA> KL
8 2021-09-10 Cape Fear 10:31 DI <NA> <NA> KL
9 2021-09-10 Cape Fear 10:36 DI <NA> <NA> KL
10 2021-09-10 Cape Fear 11:58 DI <NA> <NA> KL
11 2021-09-10 Cape Fear 12:11 DI <NA> <NA> KL
12 2021-09-10 Cape Fear 12:56 DI <NA> <NA> KL
13 2021-09-10 Cape Fear 13:35 DI <NA> <NA> KL
14 2021-09-10 Cape Fear 17:30 DI <NA> <NA> KL
15 2021-09-10 Cape Fear 09:50 KL <NA> <NA> DI
16 2021-09-10 Cape Fear 10:47 KL <NA> <NA> DI
17 2021-09-10 Cape Fear 11:14 KL <NA> <NA> DI
18 2021-09-10 Cape Fear 16:18 KL <NA> <NA> DI
19 2021-09-10 Cape Fear 16:34 KL <NA> <NA> DI
20 2021-09-10 Cape Fear 18:09 KL <NA> <NA> DI
21 2021-09-10 Cape Fear 18:20 KL <NA> <NA> DI
22 2021-09-10 Cape Fear 09:30 LOA <NA> <NA> WH
23 2021-09-10 Cape Fear 09:48 SR <NA> <NA> JR
24 2021-09-10 Cape Fear 11:03 SR <NA> <NA> JR
25 2021-09-10 Cape Fear 12:10 SR <NA> <NA> JR
26 2021-09-10 Cape Fear 13:10 SR <NA> <NA> JR
27 2021-09-10 Cape Fear 13:34 SR <NA> <NA> JR
28 2021-09-10 Cape Fear 13:55 SR <NA> <NA> JR
29 2021-09-10 Cape Fear 16:19 SR <NA> <NA> JR
30 2021-09-10 Cape Fear 16:19 SR <NA> <NA> JR
31 2021-09-10 Cape Fear 16:43 SR <NA> <NA> JR
32 2021-09-10 Cape Fear 16:43 SR <NA> <NA> JR
33 2021-09-10 Cape Fear 17:09 SR <NA> <NA> JR
34 2021-09-10 Cape Fear 11:52 WH <NA> <NA> <NA>
输出:
2021-09-10 Cape Fear 6 DI 10:01
JR 09:48
KL 10:01
LOA 09:30
SR 09:48
WH 09:30
2021-09-11 Facility Two 4 AA 10:01
DI 11:58
KL 11:58
ZZ 10:01
原始答案:
这是一种接近您的问题显示为所需输出的方法:
df1 = df.groupby(['Date', 'Facility'], as_index=False)['By Name'].nunique().rename(columns={'By Name': 'Entries'}).set_index(['Date', 'Facility'])
df2 = df[['Date', 'Facility', 'By Name']].join(df1, on=['Date', 'Facility'])
df = df.assign(Entries=df2['Entries']).reindex(columns=['Date', 'Facility', 'Entries'] + [col for col in df.columns if col not in ['Date', 'Facility']])
df = df.groupby(['Date', 'Facility', 'Entries', 'By Name']).nth(0)
示例 1(使用问题中的原始输入):
Date Facility Begin Time By Name Preceptor Preceptee Circulator
0 2021-09-10 Cape Fear 10:01 DI <NA> <NA> KL
1 2021-09-10 Cape Fear 10:31 DI <NA> <NA> KL
2 2021-09-10 Cape Fear 10:36 DI <NA> <NA> KL
3 2021-09-10 Cape Fear 11:58 DI <NA> <NA> KL
4 2021-09-10 Cape Fear 12:11 DI <NA> <NA> KL
5 2021-09-10 Cape Fear 12:56 DI <NA> <NA> KL
6 2021-09-10 Cape Fear 13:35 DI <NA> <NA> KL
7 2021-09-10 Cape Fear 17:30 DI <NA> <NA> KL
8 2021-09-10 Cape Fear 09:50 KL <NA> <NA> DI
9 2021-09-10 Cape Fear 10:47 KL <NA> <NA> DI
10 2021-09-10 Cape Fear 11:14 KL <NA> <NA> DI
11 2021-09-10 Cape Fear 16:18 KL <NA> <NA> DI
12 2021-09-10 Cape Fear 16:34 KL <NA> <NA> DI
13 2021-09-10 Cape Fear 18:09 KL <NA> <NA> DI
14 2021-09-10 Cape Fear 18:20 KL <NA> <NA> DI
15 2021-09-10 Cape Fear 09:30 LOA <NA> <NA> WH
16 2021-09-10 Cape Fear 09:48 SR <NA> <NA> JR
17 2021-09-10 Cape Fear 11:03 SR <NA> <NA> JR
18 2021-09-10 Cape Fear 12:10 SR <NA> <NA> JR
19 2021-09-10 Cape Fear 13:10 SR <NA> <NA> JR
20 2021-09-10 Cape Fear 13:34 SR <NA> <NA> JR
21 2021-09-10 Cape Fear 13:55 SR <NA> <NA> JR
22 2021-09-10 Cape Fear 16:19 SR <NA> <NA> JR
23 2021-09-10 Cape Fear 16:19 SR <NA> <NA> JR
24 2021-09-10 Cape Fear 16:43 SR <NA> <NA> JR
25 2021-09-10 Cape Fear 16:43 SR <NA> <NA> JR
26 2021-09-10 Cape Fear 17:09 SR <NA> <NA> JR
27 2021-09-10 Cape Fear 11:52 WH <NA> <NA> <NA>
输出:
Begin Time Preceptor Preceptee Circulator
Date Facility Entries By Name
2021-09-10 Cape Fear 5 DI 10:01 <NA> <NA> KL
KL 09:50 <NA> <NA> DI
LOA 09:30 <NA> <NA> WH
SR 09:48 <NA> <NA> JR
WH 11:52 <NA> <NA> <NA>
示例 2(添加第二个Facility
):(有关示例输入,请参见上面的更新答案。)输出:
Begin Time Preceptor Preceptee Circulator
Date Facility Entries By Name
2021-09-10 Cape Fear 5 DI 10:01 <NA> <NA> KL
KL 09:50 <NA> <NA> DI
LOA 09:30 <NA> <NA> WH
SR 09:48 <NA> <NA> JR
WH 11:52 <NA> <NA> <NA>
2021-09-11 Facility Two 2 AA 10:01 <NA> <NA> ZZ
DI 11:58 <NA> <NA> KL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.