首页 > 解决方案 > 如何迭代行并删除列匹配的所有其他行?

问题描述

我正在尝试在数据框中逐行删除任何具有相同“hole_ID”但保留原始行的行。这样最近的邻居只在不同的洞中搜索。这是我到目前为止所拥有的:

import pandas as pd
s1 = StringIO(u'''east,north,elev,hole_ID
11,11,5,A
51,51,6,A
61,61,11,A
21,21,2,B
31,31,3,B
71,71,3,B
81,81,4,B''')

df2 = pd.read_csv(s1)

for idx,row in df2.iterrows():
    dftype= df2.drop_duplicates(subset=['hole_ID'], keep='first')

这就是我得到的:

Out[20]: 
   east  north  elev hole_ID
0    11     11     5       A
3    21     21     2       B

这就是我想要得到的:

Out[18]: 
   east  north  elev hole_ID
0    11     11     5       A
3    21     21     2       B
4    31     31     3       B
5    71     71     3       B
6    81     81     4       B

因此,对于第 1 行,具有相同 hole_ID ('A') 的所有其他行都将被删除。

编辑:我需要对原始数据帧中的每一行执行此操作,以在hole_ID 不匹配的情况下执行最近邻计算。

提前致谢。

标签: pythonpandas

解决方案


我会创建一个函数。使用Series.isin 可以选择不同的ID

def remove_by_hole_ID(df,hole_ID):
    if not isinstance(hole_ID,list):
        hole_ID = [hole_ID]
    m = df['hole_ID'].isin(hole_ID)
    return pd.concat([df[m].drop_duplicates(subset = 'hole_ID'),df[~m]],sort = True)

print(remove_by_hole_ID(df,'A'))
   east  elev hole_ID  north
0    11     5       A     11
3    21     2       B     21
4    31     3       B     31
5    71     3       B     71
6    81     4       B     81


print(remove_by_hole_ID(df,['A','B']))
   east  elev hole_ID  north
0    11     5       A     11
3    21     2       B     21

推荐阅读