For循环不会遍历整个数据帧

时间:2020-05-26 14:38:33

标签: python pandas dataframe

我有此代码:

print(df)

c = 900
count = 1
for i in df['Timestamp']:
    if df['Timestamp'][i] >= c:
        c+=900
        count+=1

print('candles', count)
print(c)

它打印出这个

        Timestamp    A Bid    A Ask    B Bid    B Ask  Spread 1  Spread 2
0               0  1.22365  1.22371  1.22360  1.22374      11.0       9.0
1               0  1.22365  1.22371  1.22358  1.22369      13.0       4.0
2               0  1.22365  1.22371  1.22356  1.22368      15.0       3.0
3               0  1.22365  1.22371  1.22355  1.22367      16.0       2.0
4               1  1.22361  1.22363  1.22355  1.22367       8.0       6.0
...           ...      ...      ...      ...      ...       ...       ...
148167      55791  1.22233  1.22237  1.22227  1.22239      10.0       6.0
148168      55791  1.22233  1.22237  1.22226  1.22239      11.0       6.0
148169      55791  1.22235  1.22237  1.22226  1.22239      11.0       4.0
148170      55792  1.22233  1.22237  1.22226  1.22239      11.0       6.0
148171      55793  1.22233  1.22236  1.22226  1.22239      10.0       6.0

[148172 rows x 7 columns]

candles  37
33300

因此,基本上,最大的时间戳是55793。因此应该有61支蜡烛导致55793/900〜61。 但是由于某些原因,即使显然值更大,for循环也会在c = 33300时停止。那么,这是什么问题?

2 个答案:

答案 0 :(得分:0)

问题是您在从值中获取i作为索引(应该上升到148171)(因此限制为55793)。

您想要的可能是:

for i in range(len(df)):
    if df['Timestamp'][i] >= c:
        c+=900
        count+=1

这将是惯用的大熊猫:

for i, t in df['Timestamp'].items():
    if t >= c:
        c += 900
        count += 1

答案 1 :(得分:0)

首先,仔细观察 for 语句。您会注意到您使用的是for i in df['Timestamp'],而不是之类的for i in range(len(df['Timestamp']))。这意味着您是在df['Timestamp']中直接遍历这些项目,而不是通过这些项目的索引

因此,当您在if语句中进行类似df['Timestamp'][i]的操作时,实际上发生的是它返回位于第i 索引中的时间戳的值。这意味着在for循环的最后一次迭代中:

# Last item of df['Timestamp']
i = 55793

# Item (timestamp) at index 55793
df['Timestamp'][i] = 33300

如果时间戳记不是 int

类型,您将出现 Error

简单修复:

将行if df['Timestamp'][i] >= c替换为if i >= c。另外,提供i以外的变量名称将减少误以i为索引的可能性。


希望这可以让您深入了解此代码段中发生的事情:)