我从一个更大的数据框中得到了以下片段:
pd.DataFrame({
'sig_2':[False, False, True, True, True, True, True, True, True, True, True, False, False, False,
False, True, False, True, True, True, True, True, True, True, True, True, False, False,
False, False, True, True, True, True, False, True, True],
'tr_cnt':[0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 1, 2, 3, 4, 0, 1, 2],
'fls_cnt':[53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0],
'test1':[0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 4, 4, 4, 4, 0, 16, 16],
'test2':[54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 1, 0, 0],
'check1':[False, False, True, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False, False, False]})
tr_cnt
只是 sig_2
中连续 True 行的计数,而 fls_cnt
对 False 行执行相同的操作。 test1
和 test2
是连续行的总计数。 check1
是以下条件成立的情况:
df['test1'] > 2) & (df['fls_cnt'].shift(1) >= 2)
我想做的是用
check1
列中的相应值向前填充test1
列中的真实值。
例如,
check1
列中的第一个 True 行在 test
列中对应的值为 9。因此,我想将该值向前填充另外 8 行。下一个 True 的对应值为 4,所以我希望它向前填充另外 3 行。
我尝试过以下不同的方法:
mask = (df['test1'] > 2) & (df['fls_cnt'].shift(1) >= 2)
# Trial 1
groups = mask.ne(mask.shift()).cumsum()
df['test1'] = df.groupby(groups)['test1'].ffill().astype(bool)
# Trial 2
df['test2'] = df.groupby(mask)['test1'].ffill().astype(bool)
# Trial 3
groups = (~mask).cumsum()
df['test3'] = df.groupby(groups)['test1'].ffill().astype(bool)
# Trial 4
df["test4"] = df.groupby(mask.cumsum())['test1'].ffill().fillna(False).astype(bool)
在所有这些方法中,它们似乎在条件为 True 的情况下执行我想要的操作,但它们也包含不满足此条件的行,这很奇怪。
正如 @mozway 在对您的问题的评论中指出的那样,有点不清楚您想要做什么。我在这里建议我对你的逻辑的解释。如果这不是您所期望的,我将删除答案。但在这种情况下,我也建议你回顾一下你的问题并详细说明,更清楚:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'sig_2': [False, False, True, True, True, True, True, True, True, True, True, False, False, False,
False, True, False, True, True, True, True, True, True, True, True, True, False, False,
False, False, True, True, True, True, False, True, True],
'tr_cnt': [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 1, 2, 3, 4, 0, 1, 2],
'fls_cnt': [53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0],
'test1': [0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 4, 4, 4, 4, 0, 16, 16],
'test2': [54, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 1, 0, 0],
'check1': [False, False, True, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False, False, False]
})
df['forward_fill'] = False
for i in df.index[df['check1']]:
end_index = i + df.at[i, 'test1']
if end_index > len(df):
end_index = len(df)
df.loc[i:end_index, 'forward_fill'] = True
print(df)
这给出了:
sig_2 tr_cnt fls_cnt test1 test2 check1 forward_fill
0 False 0 53 0 54 False False
1 False 0 54 0 54 False False
2 True 1 0 9 0 True True
3 True 2 0 9 0 False True
4 True 3 0 9 0 False True
5 True 4 0 9 0 False True
6 True 5 0 9 0 False True
7 True 6 0 9 0 False True
8 True 7 0 9 0 False True
9 True 8 0 9 0 False True
10 True 9 0 9 0 False True
11 False 0 1 0 4 False True
12 False 0 2 0 4 False False
13 False 0 3 0 4 False False
14 False 0 4 0 4 False False
15 True 1 0 1 0 False False
16 False 0 1 0 1 False False
17 True 1 0 9 0 False False
18 True 2 0 9 0 False False
19 True 3 0 9 0 False False
20 True 4 0 9 0 False False
21 True 5 0 9 0 False False
22 True 6 0 9 0 False False
23 True 7 0 9 0 False False
24 True 8 0 9 0 False False
25 True 9 0 9 0 False False
26 False 0 1 0 4 False False
27 False 0 2 0 4 False False
28 False 0 3 0 4 False False
29 False 0 4 0 4 False False
30 True 1 0 4 0 True True
31 True 2 0 4 0 False True
32 True 3 0 4 0 False True
33 True 4 0 4 0 False True
34 False 0 1 0 1 False True
35 True 1 0 16 0 False False
36 True 2 0 16 0 False False