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'的行
- 如果有一行,其中:
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,那么事情就会分崩离析。