如何对连续出现的熊猫列值的索引进行分组

时间:2019-11-29 05:50:49

标签: python pandas dataframe

我有一个这样的数据框,

df
col1     col2
  1        A
  2        A
  3        A
  4        B
  5        B
  6        A
  7        C
  8        C
  9        C
  10       A
  11       A
  12       A
  13       B
  14       B
  15       A

我想找到除A以外的col2值的索引并将其分组在一起并放在列表中。

因此列表将具有A以外的连续出现值的索引

列表看起来像

[[3,4],[6,7,8],[12,13]]

我可以使用for循环来检查上一个和下一个值。但是执行时间将是巨大的。我正在寻找最有效的方法来实现熊猫的快捷方式/ pythonic。

2 个答案:

答案 0 :(得分:3)

想法是前一个A的第一个Series.shift值,然后由Series.neshiftSeries.cumsum创建连续的组并传递到DataFrame.groupbylist

s = df['col2'].shift(-1).ffill()
g = s.ne(s.shift()).cumsum()[s != 'A']
out = df['col1'].groupby(g).apply(list).tolist()
print (out)
[[3, 4], [6, 7, 8], [12, 13]]

答案 1 :(得分:3)

您也可以这样

要获取索引列,您可能需要调用reset_index


df = pd.DataFrame([['1', 'A'], ['2', 'A'], ['3', 'A'], ['4', 'B'], ['5', 'B'], ['6', 'A'], ['7', 'C'], ['8', 'C'], ['9', 'C'], ['10', 'A'], ['11', 'A'], ['12', 'A'], ['13', 'B'], ['14', 'B'], ['15', 'A']], columns=('col1', 'col2'))

df2 = (df["col2"] == 'A').cumsum()[df["col2"] != 'A']
df3 = df.groupby(df2).apply(lambda g: list(g.index))
df3.to_list()