![](/img/trans.png)
[英]How to vectorize a pandas dataframe calculation where if a conditional is not met the data from the previous row is entered?
[英]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
的情況下對這段代碼進行矢量化嗎?
此類任務的兩個關鍵功能是shift
和ffill
,每組應用。 對於這個特定的問題:
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.