熊猫填充条件取决于另一列

问题描述 投票:0回答:1

我从一个更大的数据框中得到了以下片段:

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 的情况下执行我想要的操作,但它们也包含不满足此条件的行,这很奇怪。

python pandas ffill
1个回答
0
投票

正如 @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
© www.soinside.com 2019 - 2024. All rights reserved.