我有一个这样的数据框,
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。
答案 0 :(得分:3)
想法是前一个A
的第一个Series.shift
值,然后由Series.ne
,shift
和Series.cumsum
创建连续的组并传递到DataFrame.groupby
与list
:
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()