【问题标题】:Subset pandas data frame with multiple condition on several columns with date在带有日期的几列上具有多个条件的子集 pandas 数据框
【发布时间】:2019-01-30 23:12:45
【问题描述】:

我有一个数据框如下:

  slot_id class        day   base_date
0        1     A     Monday  2019-01-21
1        2     B    Tuesday  2019-01-22
2        3     C  Wednesday  2019-01-23
3        4     C  Wednesday  2019-01-23
4        5     C   Thursday  2019-01-24

带有以下信息:

example.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 4 columns):
slot_id      8 non-null int64
class        8 non-null object
day          8 non-null object
base_date    8 non-null object
dtypes: int64(1), object(3)
memory usage: 200.0+ bytes

我想获得带有class == "C" 的行,最小为base_date。我尝试了很多min 的组合都没有成功,比如这个:

example[(example['class']=="C") & min(example['base_date'])]

上面的代码有什么问题?我怎样才能得到满足上述条件的整行? 完整的example 数据框:

{'slot_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}, 'class': {0: 'A', 1: 'B', 2: 'C', 3: 'C', 4: 'C', 5: 'C', 6: 'D', 7: 'E'}, 'day': {0: 'Monday', 1: 'Tuesday', 2: 'Wednesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Tuesday', 6: 'Thursday', 7: 'Saturday'}, 'base_date': {0: datetime.date(2019, 1, 21), 1: datetime.date(2019, 1, 22), 2: datetime.date(2019, 1, 23), 3: datetime.date(2019, 1, 23), 4: datetime.date(2019, 1, 24), 5: datetime.date(2019, 1, 22), 6: datetime.date(2019, 1, 24), 7: datetime.date(2019, 1, 26)}}
example['base_date'] = pd.to_datetime(example['base_date'].astype(str), format='%d%m%Y')
example['base_date'] = example['base_date'].dt.date

【问题讨论】:

    标签: python pandas date dataframe


    【解决方案1】:

    你可以使用idxmin:

    pd.to_datetime(df.loc[df['class'] == 'C', 'base_date']).idxmin()
    # 2
    
    df.iloc[pd.to_datetime(df.loc[df['class'] == 'C', 'base_date']).idxmin()]
    
    slot_id               3
    class                 C
    day           Wednesday
    base_date    2019-01-23
    Name: 2, dtype: object
    

    如果你需要重复这样做,一个更好的解决方案是将“base_date”预先转换为datetime类型:

    df['base_date'] = pd.to_datetime(df['base_date'], errors='coerce')
    df.iloc[df.loc[df['class'] == 'C', 'base_date'].idxmin()]
    
    slot_id                        3
    class                          C
    day                    Wednesday
    base_date    2019-01-23 00:00:00
    Name: 2, dtype: object
    

    【讨论】:

    • 这成功了! :-) 但是,您将如何处理更多日期变量,例如,如果您希望 base_date 的最小值以及 date_var2 的子集为最大值。您必须单独使用 idxmin 和 idxmax 还是可以将它们混合在一个衬里中?
    • @user3507584 你想要两个单独的行吗?或者你想要一个 single 行,其中 col1 是最小值,col2 是最大值?
    • 我想知道如何使用更多的日期时间变量进行子集化。如果在 df.iloc 中使用索引 (.idxmin),那只能引用一个变量,对吧?如果您有第二个日期时间变量,看起来您将不得不使用 df.iloc 两次,对于您要设置子集的每个日期时间变量一次。我说的对吗?
    • @user3507584 嗯,我还是很难跟上。如果您可以打开一个带有一些输入和预期输出的后续问题,那就太好了,这样我就可以弄清楚如何准确地帮助您。 (如果它解决了您最初定义的问题,请考虑将其标记为已接受。)
    • @user3507584 看起来像 Wen-Ben 的重量。如果您在这个问题上仍然需要任何帮助,请告诉我,我会看看我能做些什么。
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2017-10-05
    • 2020-07-22
    相关资源
    最近更新 更多