我正在尝试有条件地删除多索引中的行(根据 Symbol
索引)(如果 Limit
等于 1),然后在接下来的几天内将其删除,直到列 Reset
对于所述符号等于 1。
Limit
定义了所述 Date
允许使用的符号数。
每个 Date
的限制相同,而 Reset 是每个 Symbol
。
如果有一种方法可以在不遍历组的情况下执行此操作,那将是最可取的。我也很感激有关如何解决此问题的方法的建议。
生成df:
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
np.random.seed(55)
symbols, symlen = 2, 3
times = np.arange(datetime(2021, 1, 5), datetime(2021, 1, 15), timedelta(days=1)).astype(np.datetime64)
tlen = len(times)
A, Z = np.array(['A', 'Z']).view('int32')
symbol_names = np.random.randint(low=A, high=Z, size=symbols * symlen, dtype='int32').view(f'U{symlen}')
limit = np.random.randint(low=0, high=2, size=symbols*tlen, dtype='int32')
end = np.random.randint(low=0, high=2, size=symbols*tlen, dtype='int32')
times = np.concatenate([times] * symbols)
names = np.array([y for x in [[s] * tlen for s in symbol_names] for y in x])
value_col = np.random.randint(low=40, high=60, size=len(times), dtype='uint32')
df = pd.DataFrame({'Value': value_col, 'Limit': limit, 'End': end}, index=[names, times])
df.index = df.index.set_names(['Symbol', 'Date'])
df['Limit'] = df.groupby('Date')['Limit'].transform('sum')-1
groups = df.groupby(['Date', 'Symbol']).sum()
当前结果:
Value Limit Reset
Date Symbol
2021-01-05 FXF 58 0 1
NHI 49 0 0
2021-01-06 FXF 50 0 0
NHI 52 0 1
2021-01-07 FXF 40 0 1
NHI 52 0 1
2021-01-08 FXF 50 0 0
NHI 53 0 1
2021-01-09 FXF 43 1 0
NHI 49 1 1
2021-01-10 FXF 47 0 0
NHI 41 0 0
2021-01-11 FXF 58 0 0
NHI 53 0 1
2021-01-12 FXF 41 1 0
NHI 58 1 0
2021-01-13 FXF 59 0 0
NHI 56 0 1
2021-01-14 FXF 53 0 1
NHI 53 0 1
所需的输出:
Value Limit Reset
Date Symbol
2021-01-05 FXF 58 0 1
NHI 49 0 0
2021-01-06 FXF 50 0 0
NHI 52 0 1
2021-01-07 FXF 40 0 1
NHI 52 0 1
2021-01-08 FXF 50 0 0
NHI 53 0 1
2021-01-09 FXF 43 1 0
2021-01-10 FXF 47 0 0
2021-01-11 FXF 58 0 0
NHI 53 0 1
2021-01-12 FXF 41 1 0
2021-01-13 FXF 59 0 0
NHI 56 0 1
2021-01-14 FXF 53 0 1
NHI 53 0 1