如何遍历数据框以选择满足条件的行,包括在python中的索引

时间:2020-06-23 23:38:01

标签: python pandas dataframe

我在根据代码中定义的条件调出行及其相应的索引时遇到问题。我已经尝试了这里找到的所有示例,但是没有一个与我遇到的问题完全相同。数据集如下所示:

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

谢谢

2 个答案:

答案 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

行的目的