说我有这样的数据框:
Open Close Split
144 144 False
142 143 False
... ... ...
138 139 False
72 73 True
72 74 False
75 76 False
... ... ...
79 78 False
显然,数据框可能非常大,可能包含其他列,但这是核心。
我的最终目标是调整所有数据以考虑拆分,到目前为止,我已经能够确定拆分("拆分"列)
现在,我正在寻找一种优雅的方法,在分割前将所有内容除以2,或者将分割后的所有内容乘以2。
我认为最好的方法可能是将True向下传播到底部,然后在" Split"中将所有包含True的行相乘。专栏,但有更多的Pythonic方式吗?
答案 0 :(得分:2)
假设Split
是唯一的布尔列,并且其他所有内容都是数字的,您可以采用cumsum并相应地设置值{ - 1}} -
loc
m = df.pop('Split').cumsum()
df.loc[m.eq(0)] /= 2 # division before split
df.loc[m.eq(1)] *= 2 # multiplication after split
这是目前性能最佳的选择。另一种可能的选择涉及df
Open Close
0 72.0 72.0
1 71.0 71.5
2 69.0 69.5
3 144.0 146.0
4 144.0 148.0
5 150.0 152.0
6 158.0 156.0
-
np.where
df[:] = np.where(m.eq(0)[:, None], df / 2, df * 2)
或者,
df
Open Close
0 72.0 72.0
1 71.0 71.5
2 69.0 69.5
3 144.0 146.0
4 144.0 148.0
5 150.0 152.0
6 158.0 156.0
/ df.where
-
df.mask
或者,
(df / 2).where(m.eq(0), df * 2)
(df / 2).where(m.ne(0), df * 2)
这些与 Open Close Split
0 72.0 72.0 0
1 71.0 71.5 0
2 69.0 69.5 0
3 144.0 146.0 2
4 144.0 148.0 0
5 150.0 152.0 0
6 158.0 156.0 0
的索引选项一样有效,因为它涉及大量冗余计算。
答案 1 :(得分:0)
另一个基于cumsum
的解决方案:
columns = ['Open','Close']
df[columns] = df[columns].mul(df.Split.cumsum() + 1, axis=0)
# Open Close Split
#0 144 144 False
#1 142 143 False
#2 138 139 False
#3 144 146 True
#4 144 148 False
#5 150 152 False
#6 158 156 False
答案 2 :(得分:0)
split_true = df[df['Split'] == True].index[0]
df.iloc[split_true:,:]