【问题标题】:Organise data by likelihood and create new columns with the newly organised values in Python按可能性组织数据并使用 Python 中新组织的值创建新列
【发布时间】:2017-08-24 22:04:21
【问题描述】:

我对 Python 完全陌生,所以如果我的问题不完全清楚或太明显,我将感谢您的耐心等待。

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

这是我需要做的:

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

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

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

示例

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+ 行,可能需要数百个不同的系列。

感谢您的帮助!

【问题讨论】:

  • 您在循环中使用全局变量,因此它们内部没有定义。您可以做的一件事是在使用它的循环内使用 global 关键字,例如 global variable_name
  • @0decimal0 感谢您的及时。我不知道全球。会检查的。

标签: python pandas loops split series


【解决方案1】:

我想我明白你在问什么,但不是 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

编辑:

你是对的,代码有错误。在可能增加超过列表长度之后,我正在测试索引边界,然后通过将索引检查减少到&lt; [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

【讨论】:

  • 非常感谢您的帖子。在我学习的过程中,我需要一点时间来理解它并将其应用到我的数据中。我会在测试时给您回信。
  • 我这样做了吗?我再也看不到你的答案了。不知道发生了什么。我给你写了一条消息,你的答案消失了。如果我这样做了,请原谅我是否有办法再次看到您的答案?
  • @The_rookie 如果这可以解决您的问题,我相信它应该,请撤消反对票并接受答案:) 如果您需要帮助理解它,我可以尝试进一步解释。简而言之,它无需手动重复每个 for 循环即可复制您的流程。
  • 我已经对其进行了测试,它可以完成这项工作。非常感谢。只有一个小细节,最后一个数字没有出现。在我的示例中,这意味着缺少 51。而且我无法撤消对@solaxun 的否决。我已经尝试并阅读了一些帖子,看来您必须有特殊的权利才能投反对票。我在这里有点困惑。
  • 不要为反对票而汗流浃背。特别是因为我给了你错误的答案。我可能应得的! :)
猜你喜欢
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多