【问题标题】:In Pandas, how can I filter all rows for a unique ID based on a condition affecting only certain entries?在 Pandas 中,如何根据仅影响某些条目的条件过滤所有行以获得唯一 ID?
【发布时间】:2021-04-06 00:25:43
【问题描述】:

我正在使用这样的数据框:

import pandas as pd
import datetime
records = [{'Name':'John', 'Start':'2020-01-01','Stop':'2020-03-31'}, {'Name':'John', 'Start':'2020-04-01','Stop':'2020-12-31'}, 
       {'Name':'Mary', 'Start':'2020-01-01','Stop':'2020-03-15'}, {'Name':'Mary', 'Start':'2020-03-16','Stop':'2020-03-31'}, 
       {'Name':'Mary', 'Start':'2020-04-01','Stop':'2020-12-31'}, {'Name':'Stan', 'Start':'2020-02-01','Stop':'2020-03-31'},
       {'Name':'Stan', 'Start':'2020-04-01','Stop':'2020-12-31'}]
df = pd.DataFrame(records)
df['Start'] = pd.to_datetime(df['Start'])
df['Stop'] = pd.to_datetime(df['Stop'])
df

给出输出

Name         Start       Stop
0   John    2020-01-01  2020-03-31
1   John    2020-04-01  2020-12-31
2   Mary    2020-01-01  2020-03-15
3   Mary    2020-03-16  2020-03-31
4   Mary    2020-04-01  2020-12-31
5   Stan    2020-02-01  2020-03-31
6   Stan    2020-04-01  2020-12-31

我想要做的是选择开始日期为 2020-01-01 的所有个人的所有记录。也就是说,如果某人没有从 1/1 开始的记录,那么我不想要他们的任何记录。结果应该给我这个:

    Name    Start   Stop
0   John    2020-01-01  2020-03-31
1   John    2020-04-01  2020-12-31
2   Mary    2020-01-01  2020-03-15
3   Mary    2020-03-16  2020-03-31
4   Mary    2020-04-01  2020-12-31

输出中应该没有 Stan 的记录,因为他的条目都没有以 2020-01-01 开头。关于如何做到这一点的任何想法?谢谢!

【问题讨论】:

标签: python pandas dataframe filter


【解决方案1】:

尝试按变换分组的条件:

df[df['Start'].eq("2020-01-01").groupby(df["Name"]).transform('any')]

   Name      Start       Stop
0  John 2020-01-01 2020-03-31
1  John 2020-04-01 2020-12-31
2  Mary 2020-01-01 2020-03-15
3  Mary 2020-03-16 2020-03-31
4  Mary 2020-04-01 2020-12-31

【讨论】:

  • 非常适合我的示例数据,但由于某种原因不适用于我的真实数据。它只返回一个带有列标题的空数据框。我会尝试诊断。谢谢!
猜你喜欢
  • 2014-02-19
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2022-11-30
  • 2020-02-16
  • 2018-09-09
相关资源
最近更新 更多