Python 检查一列是否严格增加另一列的wrt
我有以下数据帧df:Python 检查一列是否严格增加另一列的wrt,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有以下数据帧df: Subject Marks1 Marks2 English 1 10 English 1.5 20 English 1.7 30 English 3 40 Science 1 10 Science 1.5 20 Science 1.7 15 Science 3 35 我想按受试者分组,检查Marks2是否严格地随Marks1的增加而增加。如果没有,那么我想从df中删除该组,并将其放在另一个数据
Subject Marks1 Marks2
English 1 10
English 1.5 20
English 1.7 30
English 3 40
Science 1 10
Science 1.5 20
Science 1.7 15
Science 3 35
我想按受试者分组,检查Marks2是否严格地随Marks1的增加而增加。如果没有,那么我想从df中删除该组,并将其放在另一个数据帧中。所以最后我会,
df:
问题:
Subject Marks1 Marks2
Science 1 10
Science 1.5 20
Science 1.7 15
Science 3 35
使用with COMPAGE(与比较)用于较小的值,如所有列的0
with,然后获取主题的VAL
,并通过以下方式过滤输出:
编辑:每个组的瓶颈不同,如果所有组都已排序,则可以通过以下方式提高性能:
#columns used for difference (passed to groupby())
cols = ['Subject','col1','col2']
#sorting by all columns (if possible and if necessary)
df = df.sort_values(cols)
m = df[['Marks1','Marks2']].diff().le(0).any(axis=1) & df.duplicated(cols)
vals = df.loc[m, 'Subject']
mask = df['Subject'].isin(vals)
df1 = df[mask]
.filter()
使用lambda
函数查找.diff()
以识别问题
issues=df.groupby('Subject').filter(lambda x : ((x.Marks1.diff()>0)&(x.Marks2.diff()<0)).any())
print(issues)
Subject Marks1 Marks2
4 Science 1.0 10
5 Science 1.5 20
6 Science 1.7 15
7 Science 3.0 35
Noissues=df[~df.index.isin(issues.index)]
print(Noissues)
Subject Marks1 Marks2
0 English 1.0 10
1 English 1.5 20
2 English 1.7 30
3 English 3.0 40
issues=df.groupby('Subject').filter(lambda x:((x.Marks1.diff()>0)和(x.Marks2.diff())这虽然有效,但速度非常慢,因为在实际数据中,我必须按5列分组,比较第7列是否随第6列的增加而增加,并且有800个这样的组。@Ank-所以问题出在df.groupby(['Subject','col2''col5']).diff()
-慢?@Ank-答案是eidted,有效的,如果所有组分别像group1,groups2,…groupu\u last
,那么可以只在两个列和重复的链上使用diff
。是的,编辑的版本要快得多,因为我的数据框几乎已经排序好了。这里排序很关键,super,很高兴能帮上忙;)
#columns used for difference (passed to groupby())
cols = ['Subject','col1','col2']
#sorting by all columns (if possible and if necessary)
df = df.sort_values(cols)
m = df[['Marks1','Marks2']].diff().le(0).any(axis=1) & df.duplicated(cols)
vals = df.loc[m, 'Subject']
mask = df['Subject'].isin(vals)
df1 = df[mask]
issues=df.groupby('Subject').filter(lambda x : ((x.Marks1.diff()>0)&(x.Marks2.diff()<0)).any())
print(issues)
Subject Marks1 Marks2
4 Science 1.0 10
5 Science 1.5 20
6 Science 1.7 15
7 Science 3.0 35
Noissues=df[~df.index.isin(issues.index)]
print(Noissues)
Subject Marks1 Marks2
0 English 1.0 10
1 English 1.5 20
2 English 1.7 30
3 English 3.0 40