python - 如何迭代行并删除列匹配的所有其他行?
问题描述
我正在尝试在数据框中逐行删除任何具有相同“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 不匹配的情况下执行最近邻计算。
提前致谢。
解决方案
我会创建一个函数。使用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
推荐阅读
- javascript - 如何覆盖repeat元素的remove方法并在ngx中执行删除和添加一些逻辑的操作
- ajax - 如何通过列表
从 JS 到 API - oracle - 为什么访问谓词和过滤谓词在这里是一样的?
- asp.net - LINQ-to-Entities WHERE 条件未在 sql server 上执行
- azure-active-directory - 对 Calendar.ReadWrite 应用程序访问的 Mail.Send 权限
- node.js - 乘客未能自动检测我的 nodejs 应用程序。梦想家
- javascript - CSS:引号幻灯片中的幻灯片动画
- javascript - 使用 ngFor 循环隐藏元素
- stm32 - 通过 UART 接收到无法识别的字符
- python - 基于其他两个和条件创建一个新列