如何使用 pandas Dataframe 中具有列值的行来匹配行和过滤
How to match rows and filtering using rows with column values in pandas Dataframe
例如:
我有
Name Code State Unit
John +2 AZ 3
Mike +3 UT 3
Mike +3 UT 4
Jack +4 KY 6
Jack +5 KY 6
如果所有其他列匹配
,我需要从数据框中删除最低单位
Name Code State Unit
John +2 AZ 3
Mike +3 UT 4
Jack +4 KY 6
Jack +5 KY 6
如果只需要删除第一个最低值第一个排序值并使用 DataFrame.duplicated
in boolean indexing
:
df = df.sort_values('Unit')
m1 = df.duplicated(['Name','Code','State'])
m2 = df.duplicated(['Name','Code','State'], keep=False)
df = df[m1 | ~m2]
print (df)
Name Code State Unit
0 John 2 AZ 3
2 Mike 3 UT 4
3 Jack 4 KY 6
4 Jack 5 KY 6
如果需要删除所有最低值,您可以比较第一个掩码每组的最小值:
print (df)
Name Code State Unit
0 John 2 AZ 3
1 Mike 3 UT 3
2 Mike 3 UT 3
3 Mike 3 UT 4
4 Jack 4 KY 6
5 Jack 5 KY 6
m1 = df.groupby(['Name','Code','State'])['Unit'].transform('min').eq(df['Unit'])
m2 = df.duplicated(['Name','Code','State'], keep=False)
df = df[~m1 | ~m2]
print (df)
Name Code State Unit
0 John 2 AZ 3
3 Mike 3 UT 4
4 Jack 4 KY 6
5 Jack 5 KY 6
编辑:
如果需要匹配所有列的所有最大值单位:
m1 = df.groupby(['Name','Code','State'])['Unit'].transform('max').eq(df['Unit'])
df2 = df[m1]
例如:
我有
Name Code State Unit
John +2 AZ 3
Mike +3 UT 3
Mike +3 UT 4
Jack +4 KY 6
Jack +5 KY 6
如果所有其他列匹配
,我需要从数据框中删除最低单位Name Code State Unit
John +2 AZ 3
Mike +3 UT 4
Jack +4 KY 6
Jack +5 KY 6
如果只需要删除第一个最低值第一个排序值并使用 DataFrame.duplicated
in boolean indexing
:
df = df.sort_values('Unit')
m1 = df.duplicated(['Name','Code','State'])
m2 = df.duplicated(['Name','Code','State'], keep=False)
df = df[m1 | ~m2]
print (df)
Name Code State Unit
0 John 2 AZ 3
2 Mike 3 UT 4
3 Jack 4 KY 6
4 Jack 5 KY 6
如果需要删除所有最低值,您可以比较第一个掩码每组的最小值:
print (df)
Name Code State Unit
0 John 2 AZ 3
1 Mike 3 UT 3
2 Mike 3 UT 3
3 Mike 3 UT 4
4 Jack 4 KY 6
5 Jack 5 KY 6
m1 = df.groupby(['Name','Code','State'])['Unit'].transform('min').eq(df['Unit'])
m2 = df.duplicated(['Name','Code','State'], keep=False)
df = df[~m1 | ~m2]
print (df)
Name Code State Unit
0 John 2 AZ 3
3 Mike 3 UT 4
4 Jack 4 KY 6
5 Jack 5 KY 6
编辑:
如果需要匹配所有列的所有最大值单位:
m1 = df.groupby(['Name','Code','State'])['Unit'].transform('max').eq(df['Unit'])
df2 = df[m1]