如何解决列表作为从组到列表的列表的子列表
a b
0 1 2
1 1 1
2 1 1
3 1 2
4 1 1
5 2 0
6 2 1
7 2 1
8 2 2
9 2 2
10 2 1
11 2 1
12 2 2
是否有直接方法可以制作如下第三列
a b c
0 1 2 0
1 1 1 1
2 1 1 0
3 1 2 1
4 1 1 0
5 2 0 0
6 2 1 1
7 2 1 0
8 2 2 1
9 2 2 0
10 2 1 0
11 2 1 0
12 2 2 0
其中目标[1,2]
是df.groupby('a').b.apply(list)
的子列表,找到每个组中首先适合目标的2行。
df.groupby('a').b.apply(list)
给出
1 [2,1,2,1]
2 [0,2]
[1,2]
是[2,1]
和[0,2]
def is_sub_with_gap(sub,lst):
'''
check if sub is a sublist of lst
'''
ln,j = len(sub),0
ans = []
for i,ele in enumerate(lst):
if ele == sub[j]:
j += 1
ans.append(i)
if j == ln:
return True,ans
return False,[]
对该功能进行测试
In [55]: is_sub_with_gap([1,2],[2,1])
Out[55]: (True,[1,3])
解决方法
您可以通过在自定义函数中选择组的索引值来更改输出,通过Series.explode
对其进行展平,然后通过Index.isin
来测试索引值:
L = [1,2]
def is_sub_with_gap(sub,lst):
'''
check of sub is a sublist of lst
'''
ln,j = len(sub),0
ans = []
for i,ele in enumerate(lst):
if ele == sub[j]:
j += 1
ans.append(i)
if j == ln:
return lst.index[ans]
return []
idx = df.groupby('a').b.apply(lambda x: is_sub_with_gap(L,x)).explode()
df['c'] = df.index.isin(idx).view('i1')
print (df)
a b c
0 1 2 0
1 1 1 1
2 1 1 0
3 1 2 1
4 1 1 0
5 2 0 0
6 2 1 1
7 2 1 0
8 2 2 1
9 2 2 0
10 2 1 0
11 2 1 0
12 2 2 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。