【问题标题】:Subset pandas data frame with datetime columns带有日期时间列的子集熊猫数据框
【发布时间】:2019-06-24 09:16:27
【问题描述】:

跟进this question,其中一个pandas 数据框是一个字符串变量和一个使用idx.min 的日期时间变量的子集,我们如何才能通过两个日期时间变量进行子集?对于下面的示例数据框,我们如何使用minimum base_datemaximum date_2 日期对class == C 中的行进行子集化? [答案是第 3 行]:

print(example)
   slot_id class        day   base_date      date_2
0        1     A     Monday  2019-01-21  2019-01-24
1        2     B    Tuesday  2019-01-22  2019-01-23
2        3     C  Wednesday  2019-01-22  2019-01-24
3        4     C  Wednesday  2019-01-22  2019-01-26
4        5     C  Wednesday  2019-01-24  2019-01-25
5        6     C   Thursday  2019-01-24  2019-01-22
6        7     D    Tuesday  2019-01-23  2019-01-24
7        8     E   Thursday  2019-01-24  2019-01-30
8        9     F   Saturday  2019-01-26  2019-01-31

对于 class == "C"minimum base_date 我们可以使用:

df.iloc[pd.to_datetime(df.loc[df['class'] == 'C', 'base_date']).idxmin()]

但是,如果我们有 2 个或更多日期变量的条件,例如 max/min,那么索引解决方案是否仍然实用?具有 2 个或更多变量的索引子集是否暗示嵌套 df.iloc?这是使用 2 个或更多日期时间变量执行子集的唯一方法吗?

数据:

print(example.to_dict())
{'slot_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9}, 'class': {0: 'A', 1: 'B', 2: 'C', 3: 'C', 4: 'C', 5: 'C', 6: 'D', 7: 'E', 8: 'F'}, 'day': {0: 'Monday', 1: 'Tuesday', 2: 'Wednesday', 3: 'Wednesday', 4: 'Wednesday', 5: 'Thursday', 6: 'Tuesday', 7: 'Thursday', 8: 'Saturday'}, 'base_date': {0: datetime.date(2019, 1, 21), 1: datetime.date(2019, 1, 22), 2: datetime.date(2019, 1, 22), 3: datetime.date(2019, 1, 22), 4: datetime.date(2019, 1, 24), 5: datetime.date(2019, 1, 24), 6: datetime.date(2019, 1, 23), 7: datetime.date(2019, 1, 24), 8: datetime.date(2019, 1, 26)}, 'date_2': {0: datetime.date(2019, 1, 24), 1: datetime.date(2019, 1, 23), 2: datetime.date(2019, 1, 24), 3: datetime.date(2019, 1, 26), 4: datetime.date(2019, 1, 25), 5: datetime.date(2019, 1, 22), 6: datetime.date(2019, 1, 24), 7: datetime.date(2019, 1, 30), 8: datetime.date(2019, 1, 31)}}

数据预处理:

example = pd.DataFrame(example)
example['base_date'] = pd.to_datetime(example['base_date'].astype(str), format='%d%m%Y')
example['base_date'] = example['base_date'].dt.date
example['date_2'] = pd.to_datetime(example['date_2'].astype(str), format='%d%m%Y')
example['date_2'] = example['date_2'].dt.date

【问题讨论】:

    标签: python pandas date dataframe subset


    【解决方案1】:

    您可以使用transform

    yourdf=example[example['base_date']==example.groupby('class')['base_date'].transform('min')]
    

    如果仅适用于 C 列

    yourdf.loc[yourdf['class']=='C',:]
    

    另外idxminidxmax 只会返回第一个满足最小值或最大值条件的索引,所以当有多个最大值或最小值时,它们仍然只显示一个索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多