我有2个数据帧, struct 如下:

df1
Group1 Group2 Label
G1     A1    AA
G1     A1    BB
G1     A1    CC
G1     A2    AA
G1     A2    CC
G2     A1    BB
G2     A1    DD
G2     A2    AA
G2     A2    CC
G2     A2    DD
G2     A2    BB

df2
ID  Label_ref
1     AA
2     BB
4     CC
5     DD
7     EE

我想根据Group1Group2列对df1进行分组,并判断‘Label’列是否按ID的顺序包含df2 Label_ref中的值.

df1上的Label不需要具有df2Label_ref的所有值,但df1上的值Label不能跳过ID顺序中的任何Label_ref

预期输出:

Group1=G1,Group2=A1不跳过AA-CC之间的任何值.因此,将标记与该组对应的行.

Group1=G1Group2=A2跳过BB的值,但具有值CC.因此,不会标记与该组对应的行.

Group1=G2,Group2=A2不跳过AA-DD中的任何值,尽管它们没有按顺序排列.因此,将标记与该组对应的行.

Group1 Group2 Label  Flag
G1     A1    AA     1
G1     A1    BB     1
G1     A1    CC     1
G1     A2    AA     0
G1     A2    CC     0
G2     A1    BB     0
G2     A1    DD     0
G2     A2    AA     1
G2     A2    CC     1
G2     A2    DD     1
G2     A2    BB     1

我一直没能取得多大进展:

import pandas as pd
df1 = pd.DataFrame({
                'Group1': [ 'G1','G1', 'G1','G1','G1',
                            'G2','G2', 'G2','G2','G2','G2'],
                'Group2': ['A1','A1','A1','A2','A2',
                            'A1','A1','A2','A2','A2','A2'],
                'Label': ['AA','BB','CC','AA','CC','BB',
                            'DD','AA','CC','DD','BB']})
df2 = pd.DataFrame({
                'ID': [ 1, 2, 4, 5, 7],
                'Label_ref': ['AA','BB','CC','DD','EE']})

如果链接到我可以用来实现这一点的解决方案或函数/方法,则不胜感激

推荐答案

您可以使用映射系列:

# Create mapping series
smap = pd.Series(*pd.factorize(df2.sort_values('ID')['Label_ref']))
df1['Flag'] = df1['Label'].map(smap)

# Check if flags are consecutive for each group
is_consecutive = lambda x: (~x.diff().gt(1).any()).astype(int)
df1['Flag'] = df1.sort_values('Flag').groupby(['Group1', 'Group2'])['Flag'].transform(is_consecutive)

输出:

>>> df1
   Group1 Group2 Label  Flag
0      G1     A1    AA     1
1      G1     A1    BB     1
2      G1     A1    CC     1
3      G1     A2    AA     0
4      G1     A2    CC     0
5      G2     A1    BB     0
6      G2     A1    DD     0
7      G2     A2    AA     1
8      G2     A2    CC     1
9      G2     A2    DD     1
10     G2     A2    BB     1

Python相关问答推荐

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

按照行主要蛇扫描顺序对点列表进行排序

Python中的函数中是否有充分的理由接受float而不接受int?

在Python中为变量的缺失值创建虚拟值

使用mySQL的SQlalchemy过滤重叠时间段

TARete错误:类型对象任务没有属性模型'

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

我如何根据前一个连续数字改变一串数字?

Scrapy和Great Expectations(great_expectations)—不合作

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

将scipy. sparse矩阵直接保存为常规txt文件

未调用自定义JSON编码器

Python Pandas—时间序列—时间戳缺失时间精确在00:00

如何获取Python synsets列表的第一个内容?

基于多个数组的多个条件将值添加到numpy数组

关于两个表达式的区别

如何在Python请求中组合多个适配器?

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

利用SCIPY沿第一轴对数组进行内插