我有一个pandas数据框,看起来像这样
1 2 3 4 5 6 7 8 9 10 ... 253 254 255 256 257 258 259 260 261 262
0 30 84 126 135 137 179 242 342 426 456 ... None None None None None None None None None None
1 24 53 75 134 158 192 194 211 213 238 ... None None None None None None None None None None
2 51 143 173 257 446 491 504 510 559 616 ... None None None None None None None None None None
所以基本上我想要的是使用像这样的大小为7的步骤遍历每一行
my_range = range(1,1002,7)
检查号码是否在我当前的范围内
如果它没有归零,
如果它在我的范围内,则返回我的号码%7 + 1,
然后将属于同一范围的数字连接成一个列表
所以我最终应该有143列。
第一行应该是这样的
0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 [3,5] 0 0 0 0 and so on
我编写了这段代码并在列表上测试了它以显示我想要做的事情
z = [30,84,126,135,136,137,179,242,342,426]
c = []
def counter(maximum, inc): # resetable generator from doc example
i = 1
while i < maximum:
val = (yield i)
# If value provided, change counter
if val is not None:
i = val
else:
i += inc
ig = counter(1002, 7)
for m in z:
for i in ig:
# catch multiple nums in same range
if m < i:
clast = c.pop()
# inline if-else inside append converts int to tuple to add m to
c.append((clast if type(clast) == tuple else (clast,)) + (m%7+1,))
# reset ig count
ig.send(i - 7)
break
if i <= m < i+7:
c.append(m%7+1)
break
else:
c.append(0)
# exhaust ig if you really want full count = 143
for i in ig:
c.append(0)
print(len(c))
上面的代码输出
[0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, (3, 4, 5), 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
这就是每一行的样子
和len(c) = 143
是否有一种简单的方法可以通过pandas行实现该代码,或者更好的方法在数据框上执行此操作?
提前致谢