【问题标题】:looping through a dataframe to return rows based on 2 indexes in python循环遍历数据框以基于 python 中的 2 个索引返回行
【发布时间】:2019-03-23 11:03:15
【问题描述】:

我有一个按名称和日期和时间排序的多索引数据框,我想通过数据框选择每天的最新(时间)行。请参阅下面的示例:

 name          time            code
Trudy   1/2/2018 2:36PM       126-45
        1/2/2018 3:58PM       127-45
        1/3/2018 5:25PM       122-56
        1/4/2018 6:57PM       122-57
        1/4/2018 9:25PM       122-89
Monk    1/2/2018 3:58PM       147-56
        1/3/2018 4:20PM       258-69
        1/3/2018 5:25PM       259-87
        1/6/2018 6:57PM       254-69
Natalie 1/2/2018 5:21PM       148-35
        1/2/2018 3:54PM       458-69
        1/4/2018 2:26PM       249-47

我想得到以下结果:

 name          time            code
Trudy   1/2/2018 3:58PM       127-45
        1/3/2018 5:25PM       122-56
        1/4/2018 9:25PM       122-89
Monk    1/2/2018 3:58PM       147-56
        1/3/2018 5:25PM       259-87
        1/6/2018 6:57PM       254-69
Natalie 1/2/2018 5:21PM       148-35
        1/4/2018 2:26PM       249-47

【问题讨论】:

  • 要清楚,有多少列?这是2级MultiIndexname&date)和2级(timecode)还是别的什么?
  • 还有更多列,但这些是重要的。这是一个 2 级多索引(名称和时间)

标签: python python-3.x pandas indexing multi-index


【解决方案1】:

如果这是你的数据(一旦你reset_index()):

df = pd.DataFrame({'code': ['126-45', '127-45', '122-56', '122-57', '122-89', '147-56', '258-69', '259-87', '254-69', '148-35', '458-69', '249-47'],
                   'name': ['Trudy', 'Trudy', 'Trudy', 'Trudy', 'Trudy', 'Monk', 'Monk', 'Monk', 'Monk', 'Natalie', 'Natalie', 'Natalie'],
                   'time': ['1/2/2018 2:36PM', '1/2/2018 3:58PM', '1/3/2018 5:25PM', '1/4/2018 6:57PM', '1/4/2018 9:25PM', '1/2/2018 3:58PM', '1/3/2018 4:20PM', '1/3/2018 5:25PM', '1/6/2018 6:57PM', '1/2/2018 5:21PM', '1/2/2018 3:54PM', '1/4/2018 2:26PM']})

df['time'] = pd.to_datetime(df['time'], format='%d/%m/%Y %I:%M%p')

#      code     name                time
#0   126-45    Trudy 2018-02-01 14:36:00
#1   127-45    Trudy 2018-02-01 15:58:00
#2   122-56    Trudy 2018-03-01 17:25:00
#3   122-57    Trudy 2018-04-01 18:57:00
#4   122-89    Trudy 2018-04-01 21:25:00
#5   147-56     Monk 2018-02-01 15:58:00
#6   258-69     Monk 2018-03-01 16:20:00
#7   259-87     Monk 2018-03-01 17:25:00
#8   254-69     Monk 2018-06-01 18:57:00
#9   148-35  Natalie 2018-02-01 17:21:00
#10  458-69  Natalie 2018-02-01 15:54:00
#11  249-47  Natalie 2018-04-01 14:26:00

如果您不关心时间部分,请使用以下内容:

df.groupby(['name', pd.Grouper(key='time', freq='D')])['time', 'code'].max()

#                      code
#name    time              
#Monk    2018-02-01  147-56
#        2018-03-01  259-87
#        2018-06-01  254-69
#Natalie 2018-02-01  458-69
#        2018-04-01  249-47
#Trudy   2018-02-01  127-45
#        2018-03-01  122-56
#        2018-04-01  122-89

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2019-04-24
    相关资源
    最近更新 更多