根据条件重复Pandas DataFrame中的值
我想根据某一列的条件,在一个数据表中重复行的值。如果“Change”这一列的值等于1,那么我希望在下一次“Change”列的值等于1之前,重复“A”、“B”和“C”这几列的值。
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开始算的第二行)就出问题了。
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,然后用前面的值填充:
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)
。
顺便提一下,你几乎可以通过重采样来做到这一点(除了最后缺失的行和 Changed 列):
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