繁体   English   中英

熊猫:如果在同一天的任何其他列中,第一次出现并忽略

[英]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, PrecepteeCirculator )添加为级别行多索引。
  • 从行多索引中删除“名称类型”级别(级别 3)。
  • 将第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM