TypeError:zip参数#1必须支持Python中的迭代
我试图编写代码,在值从0变为1时查找两个索引,并将该值保存在名为TypeError:zip参数#1必须支持Python中的迭代,python,python-3.x,pandas,numpy,pandas-groupby,Python,Python 3.x,Pandas,Numpy,Pandas Groupby,我试图编写代码,在值从0变为1时查找两个索引,并将该值保存在名为idx的变量中。然后,应该提取和处理索引前后的两行。提取行的代码如下所示: df1=pd.DataFrame({'A':[1,3,4,7,8,11,1,15,20,15,16,87], 'B':[1,3,4,6,8,11,1,19,20,15,16,87], 'flag':[0,0,0,0,1,1,1,0,0,1,0,0]}) N = 2 s =
idx
的变量中。然后,应该提取和处理索引前后的两行。提取行的代码如下所示:
df1=pd.DataFrame({'A':[1,3,4,7,8,11,1,15,20,15,16,87],
'B':[1,3,4,6,8,11,1,19,20,15,16,87],
'flag':[0,0,0,0,1,1,1,0,0,1,0,0]})
N = 2
s = [x for s, e in zip(idx-N,idx) for x in range(s, e+1)]
df_before_2rows=df1.loc[df1.index.intersection(s)]
这很有效。但是,如果我在一个for循环中运行它,该循环逐个处理每个索引,那么我会得到一个错误:
df1=pd.DataFrame({'A':[1,3,4,7,8,11,1,15,20,15,16,87],
'B':[1,3,4,6,8,11,1,19,20,15,16,87],
'flag':[0,0,0,0,1,1,1,0,0,1,0,0]})
for item in idx:
N = 2
s = [x for s, e in zip(item-N,item) for x in range(s, e+1)]
df_before_2rows=df1.loc[df1.index.intersection(s)]
主要目标是在标志从0变为1之前获得两行并进行处理,然后下一步检查标志是否从0变为1,然后执行上述操作,您可以使用
groupby
和diff
的cumsum
选择不同的方法:
df = pd.DataFrame({'A':[1,3,4,7,8,11,1,15,20,15,16,87],
'B':[1,3,4,6,8,11,1,19,20,15,16,87],
'flag':[0,0,0,0,1,1,1,0,0,1,0,0]})
for _, i in df.groupby(df["flag"].shift(1).diff().eq(1).cumsum()):
if i["flag"].eq(1).any(): # this is done to skip the last group with no flag of 1
print (i.tail(3))
# do your thing with i.tail(3)...
使用原始方法进行编辑:
idx = [4,8] # I assume you retrieved the idx already
for item in idx:
N = 2
df_before_2rows=df.loc[range(item-N,item+1)]
print (df_before_2rows)
item
是idx
的一个元素item-N
也只是一个数字,因此是错误的
for item in idx:
N = 2
s = [x for s, e in zip(item-N,item) for x in range(s, e+1)]
简化为:
for item in idx:
N = 2
# s = [x for x in range(item-N, item+1)]
s = list(range(item-N, item+1))
# s = np.arange(item-N, item+1)
您的预期输出是什么?@Henry Yik,我想使用我自己的方法,只想知道在哪里需要更改代码来删除idx中项目的类型错误
迭代idx中的项目,这些项目应该是int
。你不能zip
anint
。只要做range(item-N,item+1)
就能达到你想要的@Edward。
for item in idx:
N = 2
# s = [x for x in range(item-N, item+1)]
s = list(range(item-N, item+1))
# s = np.arange(item-N, item+1)