Python 比较组内的行,包括

Python 比较组内的行,包括,python,pandas,dataframe,conditional-statements,Python,Pandas,Dataframe,Conditional Statements,我需要的似乎是基本的,但我正在努力,所以我会感谢你的帮助 此代码: data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400', 'a500', 'a500', 'a500', 'a600', 'a600', 'a600', 'a700', 'a700', 'a700', 'a800', 'a800', 'a800

我需要的似乎是基本的,但我正在努力,所以我会感谢你的帮助

此代码:

data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400', 'a500', 'a500', 'a500', 'a600', 'a600', 'a600', 'a700', 'a700', 'a700', 'a800', 'a800', 'a800', 'a900', 'a900', 'a900'],
                    'type': ['euro', 'dollar', 'yen', 'euro', 'dollar', 'yen','euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen'],
                   'model': ['EQ', 'EQ', 'EQ', 'MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ'],
                    'status_ant': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
                    'status': ['B', 'C', 'A', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'A', 'C', 'C']
                    })
这导致了以下情况:

      id    type model status_ant status
0   a100    euro    EQ          A      B
1   a100  dollar    EQ          A      C
2   a100     yen    EQ          A      A
3   a200    euro    MC          A      B
4   a200  dollar    MC          A      C
5   a200     yen    MC          A      A
6   a300    euro    EQ          B      A
7   a300  dollar    EQ          C      A
8   a300     yen    EQ          A      A
9   a400    euro    MC          B      A
10  a400  dollar    MC          C      A
11  a400     yen    MC          A      A
12  a500    euro    EQ          A      B
13  a500  dollar    EQ          A      C
14  a500     yen    EQ          A      B
15  a600    euro    EQ          B      A
16  a600  dollar    EQ          C      A
17  a600     yen    EQ          B      A
18  a700    euro    EQ          A      A
19  a700  dollar    EQ          A      A
20  a700     yen    EQ          A      B
21  a800    euro    EQ          A      B
22  a800  dollar    EQ          A      A
23  a800     yen    EQ          A      B
24  a900    euro    EQ          A      A
25  a900  dollar    EQ          A      C
26  a900     yen    EQ          A      C
我需要使用一些条件过滤我想要的行。我需要的逻辑是:

  • 首先,我要提到的这些条件应该只适用于model=='EQ'的行

  • 如果有一行,其中:

同一组中还有另一行(按id),其中

放下那两行(否则,保留它们)。同样的逻辑适用于以下行:

status_ant == 'B' and status == 'A' and type == 'euro'
同一组中还有另一行(按id),其中

无论status_ant和status中的值是什么,都不应删除type='yen'的行

注意:我知道这可能会让人困惑,但我想要的结果数据帧就是这个(它很好地说明了我提到的所有条件):

我在寻找答案,在这里找到了类似的答案:
但是我的代码无法使用它

非常感谢你的帮助和时间。 感谢您

根据更新的数据运行: 代码仍然是一样的:

print (df[~(df.model.eq('EQ') & df.status_ant.ne(df.status))])
输入数据:

data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400'],
                    'model' : ['EQ', 'EQ', 'EQ', 'MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', ],
                     'status_ant' : ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A'],
                     'status': ['B', 'C', 'A', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
                     })
这已加载到数据帧中,如下所示:

      id model status_ant status
0   a100    EQ          A      B  #exclude this row
1   a100    EQ          A      C  #exclude this row
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
6   a300    EQ          B      A #exclude this row
7   a300    EQ          C      A #exclude this row
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
更新的数据帧:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a100','a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400'],
                    'model' : ['EQ', 'EQ', 'EQ', 'EQ','MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', ],
                     'status_ant' : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A'],
                     'status': ['B', 'C', 'A', 'D', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
                     })
df = pd.DataFrame(data)
      id model status_ant status
0   a100    EQ          A      B  #exclude this row
1   a100    EQ          A      C  #exclude this row
2   a100    EQ          A      A    #include this row
3   a100    EQ          A      D    #include this row
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
7   a300    EQ          B      A  #exclude this row
8   a300    EQ          C      A  #exclude this row
9   a300    EQ          A      A    #include this row
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
      id model status_ant status
2   a100    EQ          A      A   #included
3   a100    EQ          A      D   #included
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
9   a300    EQ          A      A   #included
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
早先的答复 你在找这个吗:

print (df[~(df.model.eq('EQ') & df.status_ant.ne(df.status))])
请注意,您不需要进行分组。由于您实际上是在尝试获取数据的一个子集,因此无法进行分组

首先,它将检查df['model']='EQ'。如果为true,那么它将检查
df['status\u ant']!=df['status']

通过给出
df['status\u ant']!=df['status']
,您正在检查所有条件

status\u ant=='A'和status=='B',status\u ant=='A'和status=='C'

status\u ant=='B'和status=='A',status\u ant=='C'和status=='A'

其输出将为:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
注意:如果在
status\u ant
status
中有其他值,则此操作将不起作用。例如,如果
status\u ant
A
status
D
E
并且您希望包含该记录,那么我需要添加一个附加条件

如果您只想限制对
A
B
C
的检查,那么您可以给出:

print (df[~(df.model.eq('EQ') & df.status_ant.isin(['A','B','C']) & df.status.isin(['A','B','C']) & df.status_ant.ne(df.status))])
其输出将为:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
用于创建输入数据帧的源代码:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a100','a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400'],
                    'model' : ['EQ', 'EQ', 'EQ', 'EQ','MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', ],
                     'status_ant' : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A'],
                     'status': ['B', 'C', 'A', 'D', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
                     })
df = pd.DataFrame(data)
      id model status_ant status
0   a100    EQ          A      B  #exclude this row
1   a100    EQ          A      C  #exclude this row
2   a100    EQ          A      A    #include this row
3   a100    EQ          A      D    #include this row
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
7   a300    EQ          B      A  #exclude this row
8   a300    EQ          C      A  #exclude this row
9   a300    EQ          A      A    #include this row
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
      id model status_ant status
2   a100    EQ          A      A   #included
3   a100    EQ          A      D   #included
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
9   a300    EQ          A      A   #included
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
输入数据帧:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a100','a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400'],
                    'model' : ['EQ', 'EQ', 'EQ', 'EQ','MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', ],
                     'status_ant' : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A'],
                     'status': ['B', 'C', 'A', 'D', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
                     })
df = pd.DataFrame(data)
      id model status_ant status
0   a100    EQ          A      B  #exclude this row
1   a100    EQ          A      C  #exclude this row
2   a100    EQ          A      A    #include this row
3   a100    EQ          A      D    #include this row
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
7   a300    EQ          B      A  #exclude this row
8   a300    EQ          C      A  #exclude this row
9   a300    EQ          A      A    #include this row
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
      id model status_ant status
2   a100    EQ          A      A   #included
3   a100    EQ          A      D   #included
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
9   a300    EQ          A      A   #included
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
输出数据帧:

      id model status_ant status
2   a100    EQ          A      A
3   a200    MC          A      B
4   a200    MC          A      C
5   a200    MC          A      A
8   a300    EQ          A      A
9   a400    MC          B      A
10  a400    MC          C      A
11  a400    MC          A      A
data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a100','a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400'],
                    'model' : ['EQ', 'EQ', 'EQ', 'EQ','MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', ],
                     'status_ant' : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A'],
                     'status': ['B', 'C', 'A', 'D', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A']
                     })
df = pd.DataFrame(data)
      id model status_ant status
0   a100    EQ          A      B  #exclude this row
1   a100    EQ          A      C  #exclude this row
2   a100    EQ          A      A    #include this row
3   a100    EQ          A      D    #include this row
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
7   a300    EQ          B      A  #exclude this row
8   a300    EQ          C      A  #exclude this row
9   a300    EQ          A      A    #include this row
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A
      id model status_ant status
2   a100    EQ          A      A   #included
3   a100    EQ          A      D   #included
4   a200    MC          A      B
5   a200    MC          A      C
6   a200    MC          A      A
9   a300    EQ          A      A   #included
10  a400    MC          B      A
11  a400    MC          C      A
12  a400    MC          A      A

见索引3。它具有
状态='D'
,并包含在您的结果集中。

如果每个
id
都是列
类型的唯一值,则可以使用此解决方案。如果每个组的
True
s之和为
2
,则可以测试:

m0 = data['model']=='EQ' 
m1 = (data['status_ant'] == 'A') & (data['status'] == 'B') & (data['type'] == 'euro')
m2 = (data['status_ant'] == 'A') & (data['status'] == 'C') & (data['type'] == 'dollar')

m3 = (data['status_ant'] == 'B') & (data['status'] == 'A') & (data['type'] == 'euro')
m4 = (data['status_ant'] == 'C') & (data['status'] == 'A') & (data['type'] == 'dollar')

mask = m0 & (m1 | m2 | m3 | m4)

mask_groups = mask.groupby(data['id']).transform('sum').eq(2)

data = data[~mask | ~mask_groups]
print (data)
      id    type model status_ant status
2   a100     yen    EQ          A      A
3   a200    euro    MC          A      B
4   a200  dollar    MC          A      C
5   a200     yen    MC          A      A
8   a300     yen    EQ          A      A
9   a400    euro    MC          B      A
10  a400  dollar    MC          C      A
11  a400     yen    MC          A      A
14  a500     yen    EQ          A      B
17  a600     yen    EQ          B      A
18  a700    euro    EQ          A      A
19  a700  dollar    EQ          A      A
20  a700     yen    EQ          A      B
21  a800    euro    EQ          A      B
22  a800  dollar    EQ          A      A
23  a800     yen    EQ          A      B
24  a900    euro    EQ          A      A
25  a900  dollar    EQ          A      C
26  a900     yen    EQ          A      C

如果可能的值不唯一,则可以通过
any
进行测试,如果每组匹配,则更改
a100
的数据:

data = pd.DataFrame({'id' : ['a100', 'a100', 'a100', 'a200', 'a200', 'a200','a300','a300', 'a300', 'a400', 'a400', 'a400', 'a500', 'a500', 'a500', 'a600', 'a600', 'a600', 'a700', 'a700', 'a700', 'a800', 'a800', 'a800', 'a900', 'a900', 'a900'],
                    'type': ['euro', 'dollar', 'dollar', 'euro', 'dollar', 'yen','euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen', 'euro', 'dollar', 'yen'],
                   'model': ['EQ', 'EQ', 'EQ', 'MC', 'MC', 'MC', 'EQ','EQ', 'EQ', 'MC', 'MC', 'MC', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ', 'EQ'],
                    'status_ant': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
                    'status': ['B', 'C', 'C', 'B', 'C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'A', 'C', 'C']
                    })



你只是放弃了这四个条件吗?如果是这样,我可以发布一个解决方案,但是如果你有更多的条件,那么它就不起作用了。你也在过滤D,E,F吗?我不认为这是可能的,对吗<代码>状态=A和状态=B,状态=A和状态=C
。你指的是有这两种组合的记录吗?@JonathanLeon我有更多的行来应用这些条件,但我会尽快用更详细的数据框更新我的帖子。感谢you@JoeFerndz我指的是存在这两个条件的一组行(对于每个id)。我会很快用一个更好的数据帧样本更新这篇文章。谢谢这个代码应该仍然适用于数据集-print(df[~(df.model.eq('eq')&df.status\u ant.ne(df.status)))是的,它看起来很复杂。@jezrael,谢谢你研究这个问题。这肯定很复杂。可能需要查看幻灯片,然后将所有幻灯片放在一起。甚至考虑到concat的条件变成一列,然后移位(1)。半途而废。需要通过这一点来思考吗?首先,我的头是什么?每个组都需要测试吗?我取了一片(面具)模型=EQ并输入(欧元,美元),然后试图找出这两种条件的组合是否在其中。问题是,要将groupby值和两行作为一个集合进行检查。不知道如何得到满足条件的两行。我们需要对每个小组的结果进行测试并过滤出结果,这并不容易,也许现在可以理解了。这太棒了。您正在groupby上执行掩码并检查值eq(2)。我被困在这一部分。现在我明白了。谢谢你的解决方案。这是有道理的。@JoeFerndz-Ya,另一个问题是不能使用
isin
,因为它也匹配
A,A
B,B
是的。这就是我被困的地方。我试着和伊辛在一起,但没能摆脱它。应该走你的路去强迫每一个人。我想看看我能不能同时抓住这两个。哇!你真是太棒了。@JoeFerndz-Hmm,你认为
type
id
中是唯一的吗?如果不是,解决方案不起作用。这不是我的问题陈述。我认为它是独一无二的。当我尝试我的解决方案方法时,我正在消除重复项。所以我在EQ上过滤,输入的是美元欧元。然后删除重复项(保留=第一个)。这就是我的基础。如果我们有两个欧元的EQ A B,那么事情就会分崩离析。