【问题标题】:How to extract the last 3 indices numbers before a specific category如何提取特定类别之前的最后 3 个索引编号
【发布时间】:2019-11-05 17:11:53
【问题描述】:

更新

我有以下数据集,我希望获得一个列表,其中包含“是”标签之前的最后三个索引。 我的数据集:

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]

请注意,YES 通常出现在连续的样本范围内(2-6 个样本)。我希望得到范围内第一个 YES 之前的最后三个索引。

P.S:数据集存储在 csv 文件中,我使用 pandas 导入

【问题讨论】:

  • 数据集在python中是如何表示的?请将该信息添加到问题中
  • @DeveshKumarSingh 作为熊猫。此数据在 csv 中,我使用 pandas 导入了它
  • 将所有信息添加到问题中
  • 如果YES之前没有3个索引怎么办?
  • @rpanai 在YES之前总会有至少3个

标签: python pandas list indexing categories


【解决方案1】:

可能不是最 Pythonic 的方式,但我想不出没有 for 循环和一些切片的方法,感觉就像一个 hacky 方法:

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]

【讨论】:

  • 感谢您的回答。但是,我更新了我的问题。这仅在一个样本中标记为“是”时才有效。但是,在我的数据集 YES 中,标记为一系列连续样本,因此此代码将在该范围内的每个 YES 之前打印最后三个样本的索引。但是,我只需要范围内第一个 YES 的最后三个索引
  • @AlexDavies 编辑的答案 :) 确保你多考虑一下你的问题,有些人会因为浪费时间而生气
  • @AlexDavies 没问题,祝你好运,编码愉快!
【解决方案2】:

这里有一些易于阅读的代码,可以满足您的需求。 它遍历列表的索引并提取您需要的内容。

第二个 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']

【讨论】:

    【解决方案3】:

    假设,正如您在评论中所说,在每个“是”之前总是至少有 3 项。一个可能的解决方案是

    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)
    

    【讨论】:

    • 感谢您的回答,但是,有一个小问题。这是我的错,我没有在问题中澄清它。在我的数据集中,“是”在连续样本中被标记,它不仅在一个样本中。我将相应地编辑问题@rpanai
    • @AlexDavies 在明确询问是否是这种情况后,我添加了我的答案。如果您在 UPDATE 注释后编辑您的问题。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2023-01-12
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多