[英]Pandas DataFrame Repeat Value Based on a Condition
我正在嘗試根據列中的條件重復DataFrame中的行值。 如果列Change中的值= 1,那么我想重復A,B和C列中的值,直到下一個Change = 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行,第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
謝謝。
您可以使用NaN和ffill填寫Change == 0行:
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
如果你需要這些是bool列,那么在每列上使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.