簡體   English   中英

在應用 groupby 后,如何根據行間不同列值的比較來 select 行?

[英]How do I select rows based on comparisons of different column values across rows after applying groupby?

如果我有以下數據

姓名 開始 結尾
一個 2012 年 3 月 4 日 2014 年 7 月 9 日
17 年 5 月 2 日 2018 年 6 月 3 日
C 2013 年 4 月 10 日 2014 年 5 月 12 日
一個 2013 年 4 月 6 日 2015 年 7 月 12 日
2019 年 4 月 12 日 21 年 12 月 3 日
c 2013 年 12 月 6 日 2014 年 11 月 3 日

對於每個唯一名稱(A、B、C),我想 select 對於除正在考慮其結束日期的行之外的每一行,其結束日期晚於相同名稱的開始日期的行。 因此,在這種情況下,A 和 C。 基本上,首先使用 groupby (['Name'] ,然后在對同名的行進行比較時選擇結束日期晚於開始日期的行。

將兩列都轉換為日期時間,因此可以通過Series.lt比較 less ,然后使用GroupBy.all檢查是否所有True s per 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM