我在根据代码中定义的条件调出行及其相应的索引时遇到问题。我已经尝试了这里找到的所有示例,但是没有一个与我遇到的问题完全相同。数据集如下所示:
import pandas as pd
import datetime
import numpy as np
from matplotlib import pyplot as plt
df = pd.read_csv('Datasets.csv')
print(df)
Posted_Time Label
07/01/2018 13.01
14/01/2018 9.80
21/01/2018 9.08
28/01/2018 8.64
04/02/2018 8.78
11/02/2018 7.27
18/02/2018 7.16
25/02/2018 7.09
04/03/2018 5.85
11/03/2018 8.71
Posted_Time
是索引列,采用日期时间格式。我想选择所有超出为Label
列定义的设置阈值的行,如下所示。
df2 = df.ewm(span=4, adjust=False).mean()
mean = df2['Label'].mean().astype(float)
std = df2['Label'].std().astype(float)
thres = std+mean
i = 0
control = True
for record in df2['Label']:
if record > thres:
print(i, 'in position!', i)
control = False
i += 1
if control == True:
print('All points are within control limits.')
运行代码时,它返回数据框中的记录位置,而不是实际记录和相应的索引(Posted_Time
)。这是我得到的结果。
0 in position! 0
1 in position! 1
19 in position! 19
23 in position! 23
我在做什么错?有人可以帮忙纠正我的迭代代码以达到下面的预期结果吗?
07/01/2018 13.01 in position 0
14/01/2018 9.80
21/01/2018 9.08
04/02/2018 8.78
11/03/2018 8.71
谢谢
答案 0 :(得分:0)
我认为您只需要更改打印声明。 您有打印(i,“就位!”,i) 如果您要打印的话,我认为您需要将第一个“ i”更改为“ record”。
答案 1 :(得分:0)
您可以尝试以下方法:
nano ~/.bash_profile
这将遍历df2的每一行,检查df2['position'] = range(0, len(df2))
for idx, row in df2.iterrows():
if row['Label'] > thres:
print('{} in position {} for date: {}'.format(row['Label'], str(row['position']), idx)
的值是否大于阈值,然后在满足该条件时打印一条消息。因为您使用Label
作为索引,所以在迭代期间,任何给定行的Posted_time
的值都将保存在Posted_time
中。如果idx
是日期时间,则必须先将其转换为Posted_time
,然后才能打印。由于您没有数字索引,因此我们需要在DataFrame中添加一列,以有效地告诉我们所处的行。这是str