我希望以最快的方式完成以下操作:
我们有一个 pd.DataFrame:
df = pd.DataFrame({
'High': [1.3,1.2,1.1],
'Low': [1.3,1.2,1.1],
'High1': [1.1, 1.1, 1.1],
'High2': [1.2, 1.2, 1.2],
'High3': [1.3, 1.3, 1.3],
'Low1': [1.3, 1.3, 1.3],
'Low2': [1.2, 1.2, 1.2],
'Low3': [1.1, 1.1, 1.1]})
那看起来像:
In [4]: df
Out[4]:
High High1 High2 High3 Low Low1 Low2 Low3
0 1.3 1.1 1.2 1.3 1.3 1.3 1.2 1.1
1 1.2 1.1 1.2 1.3 1.2 1.3 1.2 1.1
2 1.1 1.1 1.2 1.3 1.1 1.3 1.2 1.1
我想知道High1、High2和High3中哪一个浮点数首次大于等于High值。如果没有,应该为np.nan。
同样的,对于Low1、Low2和Low3的值,但在这种情况下,哪一个是首次小于或等于High值。如果没有,应该为np.nan。
最后,我需要知道哪一个先出现,Low还是High。
解决此问题的一种奇怪且不太高效的方法是:
df['LowIs'] = np.nan
df['HighIs'] = np.nan
for i in range(1,4):
df['LowIs'] = np.where((np.isnan(df['LowIs'])) & (
df['Low'] >= df['Low'+str(i)]), i, df['LowIs'])
df['HighIs'] = np.where((np.isnan(df['HighIs'])) & (
df['High'] <= df['High'+str(i)]), i, df['HighIs'])
df['IsFirst'] = np.where(
df.LowIs < df.HighIs,
'Low',
np.where(df.LowIs > df.HighIs, 'High', 'None')
)
这使我得到了:
In [8]: df
Out[8]:
High High1 High2 High3 Low Low1 Low2 Low3 LowIs HighIs IsFirst
0 1.3 1.1 1.2 1.3 1.3 1.3 1.2 1.1 1.0 3.0 Low
1 1.2 1.1 1.2 1.3 1.2 1.3 1.2 1.1 2.0 2.0 None
2 1.1 1.1 1.2 1.3 1.1 1.3 1.2 1.1 3.0 1.0 High
我需要反复进行许多次迭代,其中High/Low值会有所不同,因此在执行此操作时性能至关重要。
如果High1、High2、High3和Low1、Low2、Low3可以放在一个单独的数据框中,并进行转置,或者放在一个字典中,那么我不介意。因此,为了以最佳性能准备数据的过程可能会很慢且笨拙。
我尝试过一种解决方案,但是无法以向量化方式完成,并且似乎速度也很慢:
df.loc[(df.index == 0), 'HighIs'] = np.where(
df.loc[(df.index == 0), ['High1', 'High2', 'High3']] >= 1.3
)[1][0] + 1
因此,检查第一行中哪个列为真,然后查看np.where()的索引号。
期待任何建议,并希望学到新的东西! :)