簡體   English   中英

如何對依賴於前一行的 pandas 代碼進行矢量化?

[英]How to vectorize pandas code where it depends on previous row?

我正在嘗試對 pandas 中的代碼片段進行矢量化:

我有一個像這樣生成的 pandas dataframe :

身份證 測試 瓦爾斯
0 Q52EG 0 0
1 Q52EG 0 1
2 Q52EG 1 2
3 Q52EG 1 3
4 Q52EG 1 4
5 QQ8Q4 0 5
6 QQ8Q4 0 6
7 QQ8Q4 1 7
8 QQ8Q4 1 8
9 QVIPW 1 9

如果ids列中的任何 id 在has_hist列中具有值 1,則在ftest列中所有具有相同 id 的后續行都應標記為 1,並且它不依賴於當前ftest值,如下面的 dataframe 所示:

身份證 測試 瓦爾斯 has_hist
0 Q52EG 0 0 0
1 Q52EG 0 1 0
2 Q52EG 1 2 0
3 Q52EG 1 3 1
4 Q52EG 1 4 1
5 QQ8Q4 0 5 0
6 QQ8Q4 0 6 0
7 QQ8Q4 1 7 0
8 QQ8Q4 1 8 1
9 QVIPW 1 9 0

我正在使用這樣的迭代方法來做到這一點:

previous_present = {}
has_prv_history = []
for index, value in id_df.iterrows():
    my_id = value["ids"]
    ftest_mentioned = value["ftest"]
    previous_flag = 0
    if my_id in previous_present.keys():
        previous_flag = 1
    elif (ftest_mentioned == 1):
        previous_present[my_id] = 1
    has_prv_history.append(previous_flag)
id_df["has_hist"] = has_prv_history

可以在不使用apply的情況下對這段代碼進行矢量化嗎?

此類任務的兩個關鍵功能是shiftffill ,每組應用。 對於這個特定的問題:

df2["has_hist"] = df.groupby("ids").ftest.shift().where(lambda s: s.eq(1))
df2["has_hist"] = df2.groupby("ids").has_hist.ffill().fillna(0).astype("int32")

這是一個帶有transform的變體,但是根據我的經驗,它通常比“純” Pandas 操作慢:

df2 = (
    df
    .groupby("ids")
    .ftest.transform(
        lambda s: (
            s
            .shift()
            .where(lambda t: t.eq(1))
            .ffill()
            .fillna(0)
            .astype("int32")
        )
    )
)

暫無
暫無

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

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