按可能性组织数据,并使用Python中新组织的值创建新列

时间:2017-08-24 22:04:21

标签: python pandas loops split series

我是Python的新手,所以如果我的问题不完全清楚或者问题太明显,我将非常感谢你的耐心等待。

我需要使用条件组织数据,然后使用新组织的数据创建新列。我已经创建了一个简短的例子来说明我的观点。假设S是我要组织和分割的数据。

以下是我需要做的事情:

  1. 通过计算相对元素的比率来确定相邻元素的可能性。例如,如果1.3 > S[i]/S[i+1] > 0.80,则值应存储在一系列中,例如a

  2. 如果条件不满足,请创建一个新系列b以填充下一个S[i+1],直到条件得到满足。

  3. 否则,请创建一个新系列c ...然后重新开始。

  4. 示例

    S=pd.Series([9,9,10,11,12,10,22,23,21,20,21,33,35,37,34,50,51,56,48,51])
    
    a =[]
    b = []
    c = []
    d = []
    
    i=0
    j = 1
    k=1
    m=1
    
    
    for i in range(0,19,1):
        if 1.3 > S[i]/S[i+1] > 0.80: 
            a.append(S[i])
            j +=1
        else:
          break
    
    for i in range(j,19,1):
          if 1.3 > S[i]/S[i+1] > 0.80: 
              b.append(S[i])
              k +=1
          else:
              break
    
    for i in range(j+k,19,1):
        if 1.3 > S[i]/S[i+1] > 0.80: 
            c.append(S[i])
            m +=1
        else:
            break
    
    
    for i in range(j+k+m,19,1):
        if 1.3 > S[i]/S[i+1] > 0.80:
            d.append(S[i])
        else:
            break
    
    
    print('a=',a,'b=',b,'c=',c,'d=',d)
    
    a= [9, 9, 10, 11, 12] 
    b= [22, 23, 21, 20] 
    c= [33, 35, 37] 
    d= [50, 51, 56, 48]
    

    此代码有两个主要问题:

    首先,存在问题。缺少每个生成的系列的最后一个数字。例如,在b系列中,缺少术语21

    第二,是否可以根据需要使用循环生成系列?真实数据有10000多行,可能需要数百个不同的系列。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想我明白你在问什么,但不是100%肯定。假设我正确地解释了这个问题,这就是我认为你正在寻找的。

def bucket_nums(numbers):
    groups = collections.defaultdict(list)
    i = 0
    while i < len(numbers) - 1:
        j = i
        #bug here: num[i+1] gets incremented before the bounds test
        while 1.3 > numbers[i]/numbers[i+1] > 0.8 and i < len(numbers)- 2: #also should be -1, not -2 (this is why it skipped the last one)
            groups['group{}'.format(j)].append(numbers[i])
            i += 1
        groups['group{}'.format(j)].append(numbers[i])
        i += 1
    return groups

编辑:

你是对的,代码有一个bug。我在可能递增超过列表长度之后测试索引边界,然后通过将索引检查减少到< [i+2]来错误地补偿它。以下是固定代码。离开不固定的版本公开羞辱自己懒惰,并试图为他们提出太快的答案点。

def bucket_nums(numbers):
    groups = collections.defaultdict(list)
    i = 0
    while i < len(numbers):
        j = i
        while i < len(nums) - 1:
            if  1.3 > numbers[i] / numbers[i+1] > 0.8:  
                groups['group{}'.format(j)].append(numbers[i])
                i += 1
            else:
                break
        groups['group{}'.format(j)].append(numbers[i])
        i += 1
    return groups