从熊猫获取直到最高日期的行计数



我有像下面这样的df,我想创建天高列。此列将显示直到最高日期的行计数。

date        high
05-06-20    1.85
08-06-20    1.88
09-06-20    2
10-06-20    2.11
11-06-20    2.21
12-06-20    2.17
15-06-20    1.99
16-06-20    2.15
17-06-20    16
18-06-20    9
19-06-20    14.67

应该是这样的:

date        high    dayshigh
05-06-20    1.85    nan
08-06-20    1.88    1
09-06-20    2       2
10-06-20    2.11    3
11-06-20    2.21    4
12-06-20    2.17    0
15-06-20    1.99    0
16-06-20    2.15    1
17-06-20    16      8
18-06-20    9       0
19-06-20    14.67   1

使用以下代码,但不知何故显示错误:

df["DaysHigh"] = np.repeat(0, len(df))
for i in range(0, len(df)):
for j in range(df["DaysHigh"][i].index, len(df)):
if df["high"][i] > df["high"][i-1]:
df["DaysHigh"][i] = df["DaysHigh"][i-1] + 1
else:
df["DaysHigh"][i] = 0

我什么时候做错了?谢谢

17-06-20 的天数高数字应该是 2 而不是 8?如果是这样,你基本上可以使用你已经在这里编写的代码。我在下面进行了三项更改:

  1. 从 1 而不是 0 开始 i 以避免尝试访问第 -1 个元素
  2. 删除 j 上的循环(似乎没有必要(
  3. 使用 LOC 而不是 df["high"][i] 来设置值 - 您将看到这应该可以解决有关副本和切片的警告。

保持第一行和以前一样,

for i in range(1, len(df)):
if df["high"][i] > df["high"][i-1]:
df.loc[i,"DaysHigh"] = df["DaysHigh"][i-1] + 1
else:
df.loc[i,"DaysHigh"] = 0

过程

  1. 使用 pandas.shift(( 为下一行比较结果创建一列。
  2. 计算其创建的列的累积总和
  3. 如果不需要列,请将其删除
df['tmp'] = np.where(df['high'] >= df['high'].shift(), 1, np.NaN)
df['dayshigh'] = df['tmp'].groupby(df['tmp'].isna().cumsum()).cumsum()
df.drop('tmp', axis=1, inplace=True)
df
date    high    dayshigh
0   05-06-20    1.85    NaN
1   08-06-20    1.88    1.0
2   09-06-20    2.00    2.0
3   10-06-20    2.11    3.0
4   11-06-20    2.21    4.0
5   12-06-20    2.17    NaN
6   15-06-20    1.99    NaN
7   16-06-20    2.15    1.0
8   17-06-20    16.00   2.0
9   18-06-20    9.00    NaN
10  19-06-20    14.67   1.0

好吧,我想我做到了,这是我的解决方案:

df["DaysHigh"] = np.repeat(0, len(df))
for i in range(0, len(df)):
#for i in range(len(df)-1000, len(df)): 
for j in reversed(range(i)):
if df["high"][i] > df["high"][j]:
df["DaysHigh"][i] = df["DaysHigh"][i] + 1
else:
break
print(df)
date        high    dayshigh
05-06-20    1.85    nan
08-06-20    1.88    1
09-06-20    2.00    2
10-06-20    2.11    3
11-06-20    2.21    4
12-06-20    2.17    0
15-06-20    1.99    0
16-06-20    2.15    1
17-06-20    16.00   8
18-06-20    9.00    0
19-06-20    14.67   1

最新更新