如何迭代列

数据挖掘 Python
2022-03-09 19:43:03

我有一个专栏。

x = [
    2352.6, 2410.26, 2443.31, 2525.78, 2506.58, 2530.69, 2530.49, 2545.01,
    2605.4, 2593, 2577.65, 2554.74, 2549.69, 2552.85, 2568.84, 2577.2,
    2693.18, 2624.95, 2543.44, 2513.28, 2487.48, 2464.89, 2469.41, 2427.94,
    2402.96, 2430.5, 2427.14, 2412.24, 2403.02, 2388.78, 2357.33, 2345.89,
    2342.52, 2361.01, 2368.46, 2366.9, 2354.42, 2348.75, 2343.49, 2426.54,
    2478.13, 2453.34, 2449.5, 2396.18, 2402.63]

如何创建一个包含的新列。

如果 x 的下一个值大于当前 x,则为 1。

(-1) 如果 x 的下一个值小于当前 x。

即动作 [ i ] = 1 如果 x[ i+1 ] > x[ i ]

即动作 [ i ] = (-1) 如果 x[ i+1 ] < x[ i ]

Action = [] 
for i in range(0,len(x)):
    if x['Price'][ i+1 ] > x['Price'][ i ] :
         Action[ i ] = 1 
    elif x['Price'][ i+1 ] < x['Price'][ i ]:
              x [ i ] = -1 

我试过这个,但它不工作

1个回答

我建议使用 Pandas DataFrame(你没有在你的问题中提到它)。

那么它会像下面这样简单

  1. 从您的列表中创建数据框x,调用单列x

    In [1]: import pandas as pd
    In [2]: df = pd.DataFrame(x, columns=["x"])   # x is defined in your question
    
  2. 添加一个新列(我称之为action),其中包含您的结果。因为它将是-1or +1,所以我首先将其全部填充+1,然后仅将值更改-1为满足您的条件的位置:

    In [3]: df["action"] = 1
    
    In [4]: df.head()                                                               
    Out[4]: 
             x  action
    0  2352.60     1
    1  2410.26     1
    2  2443.31     1
    3  2525.78     1
    4  2506.58     1
    
  3. 使用该diff()方法找出每行之间的差异x如果差值小于零,我们可以使action等于-1

    In [5]: df.action[df.x.diff() < 0] = -1
    
    In [6]: df                                                                                                 
    Out[6]: 
              x  action
    0   2352.60       1
    1   2410.26       1
    2   2443.31       1
    3   2525.78       1
    4   2506.58      -1
    5   2530.69       1
    6   2530.49      -1
    

如果您想将差异上移一行,因为您的规则:

动作 [ i ] = (-1) 如果 x[ i+1 ] < x[ i ]

然后您只需将其包含在分配部分中,将action列从开始索引填充到倒数第二个元素:

In [7]: df.action[:-1] = df.action[1:]

In [8]: df.head()
Out[8]:
          x  action
0   2352.60     1.0
1   2410.26     1.0
2   2443.31     1.0
3   2525.78    -1.0
4   2506.58     1.0
5   2530.69    -1.0

请注意,最后一行将包含一个可能错误的值(您无法知道,不知道 的下一个值x)。


从OP编辑后

如果你想在普通列表中这样做,你可以这样做:

In [9]: action = []

In [10]: for i, val in enumerate(x): 
     ...:    if i == (len(x) - 1): break 
     ...:    if x[i+1] < val: 
     ...:        action.append(-1) 
     ...:    else: 
     ...:        action.append(1) 

In [11]: action[:10]         # Look at the first ten elements                                                                                  
Out[11]: [1, 1, 1, -1, 1, -1, 1, 1, -1, -1]

enumerate遍历您给它的可迭代对象(此处为x)并返回当前元素的索引。我们需要不超过长度的x检查,因为我们i + 1每次都检查,所以可以尝试检查列表中一个元素的值太远x