我是Python的新手,所以如果我的问题不完全清楚或者问题太明显,我将非常感谢你的耐心等待。
我需要使用条件组织数据,然后使用新组织的数据创建新列。我已经创建了一个简短的例子来说明我的观点。假设S是我要组织和分割的数据。
以下是我需要做的事情:
通过计算相对元素的比率来确定相邻元素的可能性。例如,如果1.3 > S[i]/S[i+1] > 0.80
,则值应存储在一系列中,例如a
。
如果条件不满足,请创建一个新系列b
以填充下一个S[i+1]
,直到条件得到满足。
否则,请创建一个新系列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多行,可能需要数百个不同的系列。
感谢您的帮助!
答案 0 :(得分:0)
我想我明白你在问什么,但不是100%肯定。假设我正确地解释了这个问题,这就是我认为你正在寻找的。 p>
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