首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多准则的行过滤

基于多准则的行过滤
EN

Stack Overflow用户
提问于 2019-11-08 08:36:28
回答 1查看 42关注 0票数 1

我有以下数据:

代码语言:javascript
复制
name        date_one        date_two
-----------------------------------------
sue
sue
john    
john        13-06-2019
sally       23-04-2019
sally       23-04-2019      25-04-2019
bob         18-05-2019      14-06-2019
bob         18-05-2019      17-06-2019

数据包含重复的name行。我需要根据以下(按优先级顺序)过滤数据:

  1. 为每个name保留行与最新的date_two。如果name没有任何具有date_two值的行,则转到每个name的步骤2
  2. ,将该行保留在最新的date_one中。如果name没有任何具有date_one值的行,请转到步骤3
  3. -- names没有任何有date_onedate_two的行,所以只需保留该date_one的第一行

上述数据将被过滤为:

代码语言:javascript
复制
name        date_one        date_two
-----------------------------------------
sue
john        13-06-2019
sally       23-04-2019      25-04-2019
bob         18-05-2019      17-06-2019

这不需要以最有表现力的方式完成。dataframe只有几千行,只需要执行一次。如果需要在多个(慢的)步骤中完成,那很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 08:51:08

按最大值对每组使用DataFrameGroupBy.idxmax,然后通过Series.isin筛选出已匹配的值,最后通过concat将值连接在一起

代码语言:javascript
复制
df['date_one'] = pd.to_datetime(df['date_one'], dayfirst=True)
df['date_two'] = pd.to_datetime(df['date_two'], dayfirst=True)

#rule1
df1 = df.loc[df.groupby('name')['date_two'].idxmax().dropna()]

#rule2
df2 = df.loc[df.groupby('name')['date_one'].idxmax().dropna()]
df2 = df2[~df2['name'].isin(df1['name'])]

#rule3
df3 = df[~df['name'].isin(df1['name'].append(df2['name']))].drop_duplicates('name')

df = pd.concat([df1, df2, df3]).sort_index()
print (df)
    name   date_one   date_two
0    sue        NaT        NaT
3   john 2019-06-13        NaT
5  sally 2019-04-23 2019-04-25
7    bob 2019-05-18 2019-06-17
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58763042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档