【问题标题】:Pandas dataframe drop rows based on attributesPandas 数据框根据属性删除行
【发布时间】:2020-01-22 05:09:38
【问题描述】:

我有一个带有日期对象的 pandas 数据框。我想删除某些年份和月份的行,比如说二月。 Pythonic 的方法是什么?

df = pd.DataFrame(['2020-01-01','2020-02-02','2020-03-03','2020-04-04'],columns=['dates'])
df['dates'] = pd.to_datetime(df['dates']).dt.date

这似乎输入太多,并留下一个 NaN 值。

df["dates"] = pd.Series([date for date in df["dates"].values if date.month!=2]
        dates
0  2020-01-01
1  2020-03-03
2  2020-04-04
3         NaN

如果我尝试访问系列中所有对象的属性,则会收到错误消息。

df = df.drop(df[df.dates.month==2].index)
AttributeError: 'Series' object has no attribute 'month'

与范围比较似乎输入太多,我不知道如何组合条件。

df = df.drop(df[df.dates >= pd.to_datetime('2020-02-01') and df.dates < pd.to_datetime('2020-03-01')].index)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    使用dt 访问器,但它要求列的类型为pd.Timestamp:

    df = pd.DataFrame(['2020-01-01','2020-02-02','2020-03-03','2020-04-04'],columns=['dates'])
    df['dates'] = pd.to_datetime(df['dates']) # removed the .dt.date
    
    # Remove rows whose month are Feb, Mar or Apr, in 2018 & 2019 only
    df[~(df['dates'].dt.month.isin([2,3,4]) & df['dates'].dt.month.isin(2018, 2019))]
    

    【讨论】:

    • 太棒了!如何添加一年的条件?
    • 您写了两次 .month 并且没有使用方括号表示年份。 df[~(df['dates'].dt.year.isin([2020]) & df['dates'].dt.month.isin([2]))] 。但即便如此,它也会返回正确的答案,但不会更改数据框。如果我将它分配给数据框,它将用 NaT 替换删除的行。
    • 我已经根据你的回答解决了:code df['dates'] = pd.to_datetime(df['dates']) # removed the .dt.date def date_needed(date): return ~(date.dt.year.isin([2020]) &amp; date.dt.month.isin([2])) df = df[date_needed(df['date'])] df['date'] = df['date'].dt.date
    猜你喜欢
    • 2016-06-01
    • 2016-07-07
    • 2021-12-06
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多