基于条件重复Pandas DataFrame的值

3

我想根据一列中的条件,在DataFrame中重复行数据。如果该列中的数值为1,则需要重复列A、B和C的数值,直到下一个数值为1。

index = pandas.date_range('20000131', periods=5)
columns = ['A', 'B', 'C', 'Change']

data = {'A': pandas.Series([False, True, False, True, False], index=index)
    , 'B': pandas.Series([True, True, False, False, False], index=index)
    , 'C': pandas.Series([True, False, True, True, True], index=index)
    , 'Change' : pandas.Series([1,0,0,1,0], index=index)}

结果:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01   True   True  False       0
2000-02-02  False  False   True       0
2000-02-03   True  False   True       1
2000-02-04  False  False   True       0

期望的结果:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01  False   True   True       0
2000-02-02  False   True   True       0
2000-02-03   True  False   True       1
2000-02-04   True  False   True       0

这是我使用shift()函数能够实现的最接近需求的方法,但它只能在一行中保持。我需要它在N行中保持。在下面的示例中,它在第三行(或基于0的第2行)出现错误。
print pandas.DataFrame(numpy.where(pandas.DataFrame(df['Change']==1)
    , df, df.shift()))

结果:

       0      1      2  3
0  False   True   True  1
1  False   True   True  1
2  False   True  False  0
3   True  False   True  1
4   True  False   True  1

谢谢。

1个回答

6
你可以将Change == 0的行填充为NaN,并使用ffill进行向前填充:
In [11]: df.loc[df.Change != 1, ['A', 'B', 'C']] = numpy.nan

In [12]: df
Out[12]:
             A   B   C  Change
2000-01-31   0   1   1       1
2000-02-01 NaN NaN NaN       0
2000-02-02 NaN NaN NaN       0
2000-02-03   1   0   1       1
2000-02-04 NaN NaN NaN       0

In [13]: df.ffill()
Out[13]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       0
2000-02-02  0  1  1       0
2000-02-03  1  0  1       1
2000-02-04  1  0  1       0

如果您需要将它们转换为布尔列,请在每个列上使用astype(bool)。另外,您可以使用重新采样来实现类似的效果(除了最后缺失的行和更改列)。
In [14]: df[df.Change == 1].resample('D', fill_method='ffill')
Out[14]:
            A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       1
2000-02-02  0  1  1       1
2000-02-03  1  0  1       1

1
谢谢Andy!你回答了我在这里搜索的大部分问题。ffill完美地运作。我实际上更喜欢1和0。感谢您的快速帮助。 - tkfbristol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接