[英]Finding consecutive days in the pandas dataframe
我有一個數據框:
ColA ColB
0 A 1/2/2020
1 A 1/3/2020
2 A 1/4/2020
3 A 1/10/2020
4 B 1/3/2020
5 B 1/19/2020
6 C 1/2/2020
7 C 1/7/2020
8 D 1/8/2020
現在我想找出colA
中連續三天的系列名稱colB
。
輸出:
答案是A
,因為它有1/2/2020
, 1/3/2020
和1/4/2020
在colB
。
一般的方法是這樣的:
# 1. To make sure the dates are sorted
df = df.sort_values(["ColA", "ColB"])
# 2. Standardize the dates by offseting them
df["ColB_std"] = df["ColB"] - pd.to_timedelta(range(df.shape[0]), 'day')
# 3. Counting each instance of ColA and standardized date
s = df.groupby(["ColA", "ColB_std"])["ColB_std"].count()
# 4. Getting elements from ColA that have at least 1 sequence of at least length 3
colA = s[ s >= 3 ].index.get_level_values(0).unique().values
# 5. Filtering the dataframe
df[ df["ColA"].isin(colA) ]
您需要具有 3 個連續日期的ColA
。 或者你可以把它想象成你想要ColA
s,其中有一系列date
, date + 1 day
和date + 2 days
。 通過按 ColA 和 ColB (1)對數據框進行排序,我們知道在您要檢查的情況下, date + 1 day
將始終跟隨date
,而date + 2 days
將緊隨其后。
有了這個,您可以通過刪除與其行對應的n
天來標准化日期。 因此, date
, date + 1 day
和date + 2 days
的序列成為date
, date
and date
(2) 。
現在我們已經標准化了日期列,我們只需要計算每對('ColA', 'ColB_std')
存在多少個元素(3) ,從ColA
中獲取計數為 3 或更多(4)的元素,以及過濾數據框(5) 。
但是,這不支持重復的('ColA', 'ColB')
,為此您需要先執行此操作:
df2 = df.drop_duplicates(["ColA", "ColB"])
繼續在步驟 1、2、3 和 4 中使用此df2
,最后在步驟 5 中過濾真實的df
。
以前,我回答說你也可以這樣做:
# To make sure the dates are sorted
df = df.sort_values(["ColA", "ColB"])
# Calculating the difference between dates inside each group
s = df.groupby("ColA")["ColB"].diff().dt.days
# Filtering the dataframe
df[ ((s == 1) & (s.shift(1) == 1)).groupby(df["ColA"]).transform("any") ]
這個想法是在s
,差異總是在前一個日期和當前日期之間。 但是,這並不能確保有 3 個連續的日期,只有 2 個。通過將系列移動 1,您可以確保當前的不同日期和前一個日期是 1 [ (s == 1) & (s.shift(1) == 1)
]。
之后,我只是groupby(df["ColA"])
,並使用transform("any")
檢查組內的任何元素是否為真。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.