【问题标题】:应用groupby后,如何根据行间不同列值的比较来选择行?
【发布时间】:2022-01-23 11:00:42
【问题描述】:

如果我有以下数据

Name Start End
A 3/4/12 7/9/14
B 5/2/17 6/3/18
C 4/10/13 5/12/14
A 4/6/13 7/12/15
B 4/12/19 12/3/21
c 12/6/13 11/3/14

对于每个唯一名称(A、B、C),我想为除正在考虑结束日期的行之外的每一行选择结束日期晚于相同名称的开始日期的行。因此,在这种情况下,A 和 C。基本上,首先使用 groupby (['Name'] ,然后在对同名的行进行比较时选择结束日期晚于开始日期的行。

【问题讨论】:

  • 你能解释为什么B不匹配吗?每行后面总是有End
  • 两列的最后一个数字是year?第一个是月份?

标签: python pandas loops if-statement group-by


【解决方案1】:

将两列都转换为日期时间,因此可以通过Series.lt 比较less,然后使用GroupBy.all 检查是否所有Trues 每个Name 和最后一个过滤器索引:

df['Start'] = pd.to_datetime(df['Start'], format='%m/%d/%y')
df['End'] = pd.to_datetime(df['End'], format='%m/%d/%y')

s = df['Start'].lt(df['End']).groupby(df['Name']).all()

out = s.index[s].tolist()
print (out)

或更改Series.gt 的掩码并通过numpy.setdiff1d 获得差异:

df['Start'] = pd.to_datetime(df['Start'], format='%m/%d/%y')
df['End'] = pd.to_datetime(df['End'], format='%m/%d/%y')

out = np.setdiff1d(df['Name'], df.loc[df['Start'].gt(df['End']), 'Name']).tolist()

【讨论】:

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