更新
我有以下数据集,我希望得到一个列表,其中包括“是”标签之前的最后三个索引。我的数据集:
i category
0 NO
1 NO
2 NO
3 NO
4 NO
5 YES
6 YES
7 YES
8 NO
9 NO
10 NO
11 YES
12 YES我期望结果是:
list=2,3,4,8,9,10
请注意,是的通常发生在连续的范围内(2-6个样本).我希望得到最后三个指数之前的第一个是在范围内。。
P.S:数据集存储在csv文件中,我使用熊猫导入
发布于 2019-06-23 20:49:42
也许不是最重要的节奏曲,但如果没有for循环和一些切片,我想不出有一种方法可以做到这一点,感觉就像一种笨拙的方法:
a = df[((df.category.ne(df.category.shift()))==True) & (df.category == 'YES')].index
indices = []
for x in a:
indices.append(df.iloc[slice(max(0, x-3), min(x, len(df)))])
new_df = pd.concat(indices) # if you wanted this as a df.
list(new_df.index)
[2, 3, 4, 8, 9, 10]发布于 2019-06-23 20:39:14
让我们假设,正如您在您的评论中所说的,在每一个“是”之前总是至少有三个项目。一个可能的解决办法是
import pandas as pd
flatten = lambda l: [item for sublist in l for item in sublist]
df = pd.DataFrame({"category":['NO', 'NO', 'NO', 'NO', 'NO',
'YES', 'NO', 'NO', 'NO', 'NO',
'NO','YES','NO']})
# take only indices where YES occurs
idx = df[df["category"]=="YES"].index
# for every i in idx take the previuos 3 indices
lst = [list(range(i-3, i)) for i in idx]
# flatten lst
lst = flatten(lst)发布于 2019-06-23 21:03:57
以下是一些易于阅读的代码,可以做您想做的事情。它遍历列表的索引并提取所需的内容。
第二个for循环是简单地将结果列表中的双列表扁平。
li= ['1','2','3','4','YES','6','7','8','9','0','YES']
result = []
for x in range(len(li)):
if li[x] is 'YES':
result.append(li[x-3:x])
final= []
for x in result:
for y in x:
final.append(y)final = '2','3','4','8','9','0‘
https://stackoverflow.com/questions/56727354
复制相似问题