簡體   English   中英

Python/Pandas:從大型 dataframe 中提取區間

[英]Python/Pandas: extract intervals from a large dataframe

我有兩個 pandas 數據幀:

  1. 2000 萬行持續時間序列數據,帶有 DateTime Index (df) IMG
  2. 20,000 行,帶有兩個時間戳 (df_seq) IMG

我想使用第二個 Dataframe 從第一個中提取所有序列(每行 2. 的兩個時間戳之間的第一個的所有行),然后每個序列需要轉置為 990 列,然后所有序列必須是結合在一個新的 DataFrame 中。

因此,新的 DataFrame 有一行,每個序列IMG有 990 列(稍后添加案例行)。

現在我的代碼如下所示:

sequences = pd.DataFrame()

for row in df_seq.itertuples(index=True, name='Pandas'):
    sequences = sequences.append(df.loc[row.date:row.end_date].reset_index(drop=True)[:990].transpose())

sequences = sequences.reset_index(drop=True)

此代碼有效,但非常慢 --> 20-25 分鍾執行時間

有沒有辦法在矢量化操作中重寫它? 或任何其他方式來提高此代碼的性能?

這是一種方法。 大號 dataframe 為“df”,間隔一稱為“間隔”:

inx = pd.date_range(start="2020-01-01", freq="1s", periods=1000)
df = pd.DataFrame(range(len(inx)), index=inx)
df.index.name = "timestamp"

intervals = pd.DataFrame([("2020-01-01 00:00:12","2020-01-01 00:00:18"), 
                   ("2020-01-01 00:01:20","2020-01-01 00:02:03")], 
                  columns=["start_time", "end_time"])

intervals.start_time = pd.to_datetime(intervals.start_time)
intervals.end_time = pd.to_datetime(intervals.end_time)
intervals

t = pd.merge_asof(df.reset_index(), intervals[["start_time"]], left_on="timestamp", right_on="start_time", )
t = pd.merge_asof(t, intervals[["end_time"]], left_on="timestamp", right_on="end_time", direction="forward")

t = t[(t.timestamp >= t.start_time) & (t.timestamp <= t.end_time)]

結果是:

              timestamp    0          start_time            end_time
12  2020-01-01 00:00:12   12 2020-01-01 00:00:12 2020-01-01 00:00:18
13  2020-01-01 00:00:13   13 2020-01-01 00:00:12 2020-01-01 00:00:18
14  2020-01-01 00:00:14   14 2020-01-01 00:00:12 2020-01-01 00:00:18
15  2020-01-01 00:00:15   15 2020-01-01 00:00:12 2020-01-01 00:00:18
16  2020-01-01 00:00:16   16 2020-01-01 00:00:12 2020-01-01 00:00:18
..                  ...  ...                 ...                 ...
119 2020-01-01 00:01:59  119 2020-01-01 00:01:20 2020-01-01 00:02:03
120 2020-01-01 00:02:00  120 2020-01-01 00:01:20 2020-01-01 00:02:03
121 2020-01-01 00:02:01  121 2020-01-01 00:01:20 2020-01-01 00:02:03
122 2020-01-01 00:02:02  122 2020-01-01 00:01:20 2020-01-01 00:02:03
123 2020-01-01 00:02:03  123 2020-01-01 00:01:20 2020-01-01 00:02:03

在上述答案的步驟之后,我添加了一個 groupby 和一個 unstack ,結果正是我需要的 df :

執行時間約為 30 秒!

完整的代碼現在看起來像這樣:

sequences = pd.merge_asof(df, df_seq[["date"]], left_on="timestamp", right_on="date", )
sequences = pd.merge_asof(sequences, df_seq[["end_date"]], left_on="timestamp", right_on="end_date", direction="forward")
sequences = sequences[(sequences.timestamp >= sequences.date) & (sequences.timestamp <= sequences.end_date)]

sequences = sequences.groupby('date')['feature_1'].apply(lambda df_temp: df_temp.reset_index(drop=True)).unstack().loc[:,:990]
sequences = sequences.reset_index(drop=True)

暫無
暫無

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

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