簡體   English   中英

在大熊貓數據框中查找連續天數

[英]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/20201/3/20201/4/2020colB

一般的方法是這樣的:

# 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,其中有一系列datedate + 1 daydate + 2 days 通過按 ColA 和 ColB (1)對數據框進行排序,我們知道在您要檢查的情況下, date + 1 day將始終跟隨date ,而date + 2 days將緊隨其后。

有了這個,您可以通過刪除與其行對應的n天來標准化日期。 因此, date , date + 1 daydate + 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.

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