将bool的pandas DataFrame中的每个“True”值展开为固定长度的“True-Block”

时间:2017-05-16 10:31:03

标签: pandas dataframe

我有一个像这样的bool值的pandas Dataframe:

df = pd.DataFrame(
    index=range(10),
    data={
        'A': [False, False, True, False, False, False, False, False, True, False],
        'B': [True, False, True, True, True, False, False, False, False, False]
    }
)

我想将每个True - 值扩展为至少长度True的“n=3 - 块”,从原始True开始向前扩展 - 值(如果我们位于DataFrame的末尾,则小于n,请参阅下面的示例A)。理想的结果原则上按每列计算:对于每个True,确保下一个n-1值也是True。所以期望的输出将是

desired = pd.DataFrame(
    index=range(10),
    data={
        'A': [False, False, True, True, True, False, False, False, True, True],
        'B': [True, True, True, True, True, True, True, False, False, False
    }
)

这似乎是一个简单的问题,要求一个单行,但我不能得到像熊猫一样有效的解决方案。

如果找到了this related question,但由于我不受日期间隔的约束,因此在这里并不完全适用。

1 个答案:

答案 0 :(得分:2)

<强>更新

In [97]: df.replace(False, np.nan).ffill(limit=2).fillna(False).astype(bool)
Out[97]:
       A      B
0  False   True
1  False   True
2   True   True
3   True   True
4   True   True
5  False   True
6  False   True
7  False  False
8   True  False
9   True  False

旧回答:

In [55]: idx = df.loc[df.B].index

In [57]: df.loc[idx.union(idx+1).union(idx+2), 'B'] = True

In [58]: df
Out[58]:
       A      B
0  False   True
1  False   True
2   True   True
3  False   True
4  False   True
5  False   True
6  False   True
7  False  False
8   True  False
9  False  False