python - 如何对连续出现的 pandas 列值的索引进行分组

标签 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 循环来检查上一个和下一个值。但执行时间会很长。我正在寻找 pandas 快捷方式/pythonic 方式来最有效地做到这一点。

最佳答案

想法第一Series.shift之前的 A 的值,然后按 Series.ne 创建连续的组, shiftSeries.cumsum并传递至DataFrame.groupby列表:

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]]

关于python - 如何对连续出现的 pandas 列值的索引进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099362/

相关文章:

python - 优化 itertools 与分组 DataFrame 和后置过滤器的组合

R - 从 colMeans 函数创建数据帧

scala - 如何为 Spark 数据帧编写多个 WHEN 条件?

python - Pandas 中的数据分组

python - Dataframe pandas 中的 POS 标记-Textblog

python - 从二进制字符串加载OpenCV图像

python - 在多列数据上拟合 MultinomialNB

python - pandas groupby 两个相似的列和两个不同的列

python - 如何统计属于每个组的条目数?

python - 对日期和给定日期中的值数量进行排序