![](/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.