我的问题是删除两个重复的行。我有一个文本文件:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.12 --- 00:A0:57:2E:A6:12
192.168.1.11 --- 00:1D:A2:80:3C:CC
192.168.1.7 --- F0:9F:C2:0A:48:E7
192.168.1.6 --- 80:2A:A8:C9:85:1C
192.168.1.1 --- F0:9F:C2:05:B7:A6
192.168.1.9 --- DC:4A:3E:DF:22:06
192.168.1.8 --- 80:2A:A8:C9:8E:F6
192.168.1.1 --- F0:9F:C2:05:B7:A6
192.168.1.7 --- F0:9F:C2:0A:48:E7
192.168.1.12 --- 00:A0:57:2E:A6:12
192.168.1.11 --- 00:1D:A2:80:3C:CC
192.168.1.6 --- 80:2A:A8:C9:85:1C
192.168.1.8 --- 80:2A:A8:C9:8E:F6
文本文件与它的外观完全相同。请帮助我,我想删除两个重复的行,使其只保留:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.9 --- DC:4A:3E:DF:22:06
谢谢你们的帮助。
选项1
使用Numpy
首先,用np.loadtxt
加载文件。
x = np.loadtxt('file.txt', dtype=str, delimiter=',')
# bogus delimiter so that a 1D array is loaded
接下来,将np.unique
与return\u counts=True
一起使用,并查找所有未重复的唯一条目。
unique, counts = np.unique(x, return_counts=True)
out = unique[counts == 1]
out
array(['192.168.1.18 --- B8:27:EB:48:C3:B6',
'192.168.1.9 --- DC:4A:3E:DF:22:06'],
dtype='<U34')
选项2
使用pandas
使用pd加载数据。读取\u csv
,然后调用drop\u duplicates
。
df = pd.read_csv('file.txt', delimiter=',', header=None)
df
0
0 192.168.1.18 --- B8:27:EB:48:C3:B6
1 192.168.1.12 --- 00:A0:57:2E:A6:12
2 192.168.1.11 --- 00:1D:A2:80:3C:CC
3 192.168.1.7 --- F0:9F:C2:0A:48:E7
4 192.168.1.6 --- 80:2A:A8:C9:85:1C
5 192.168.1.1 --- F0:9F:C2:05:B7:A6
6 192.168.1.9 --- DC:4A:3E:DF:22:06
7 192.168.1.8 --- 80:2A:A8:C9:8E:F6
8 192.168.1.1 --- F0:9F:C2:05:B7:A6
9 192.168.1.7 --- F0:9F:C2:0A:48:E7
10 192.168.1.12 --- 00:A0:57:2E:A6:12
11 192.168.1.11 --- 00:1D:A2:80:3C:CC
12 192.168.1.6 --- 80:2A:A8:C9:85:1C
13 192.168.1.8 --- 80:2A:A8:C9:8E:F6
df.drop_duplicates(keep=False)
0
0 192.168.1.18 --- B8:27:EB:48:C3:B6
6 192.168.1.9 --- DC:4A:3E:DF:22:06
要保存到文本,可以使用pd.to_csv
:
df.to_csv('file.txt', delimiter='')
问题中没有太多细节,您已经标记了numpy
,这是一个要求还是一个兴趣?
如果没有具体要求,请使用标准库:
d = {}
with open('/file/path', 'r') as f:
for line in f:
if line not in d:
d[line] = 1
else:
d[line] += 1
no_dup = [line for line in d if d[line] < 2]
另一个简短的替代集合。计数器
对象:
import collections
with open('lines.txt', 'r') as f:
for k,c in collections.Counter(f.read().splitlines()).items():
if c == 1:
print(k)
输出:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.9 --- DC:4A:3E:DF:22:06
问题内容: 这个问题已经在这里有了答案 : 在MySQL中删除重复的行 (25个答案) 3个月前关闭。 如何从MySQL表中删除所有重复数据? 例如,具有以下数据: 我会使用,如果它是一个查询。 我该怎么做才能只删除重复项并仅保留每个记录一个? 问题答案: 编辑者警告:此解决方案的计算效率低下,可能会降低大型表的连接。 注意:您 需要 首先在表的 测试副本 上执行此操作! 完成此操作后,我发现,除
函数非常适合统一数据帧。但是,要传递的关键字参数之一是或,而我希望删除列子集中所有重复的行。这有可能吗? 例如,我想删除与列和匹配的行,因此这应该删除行0和1。
我需要删除所有行而不留下任何唯一记录。如果存在重复,则删除所有匹配的行。Criteria是C列,如果C列中存在任何重复记录,则删除整行(包括unique)。
问题内容: 我有一个numpy值数组: 我想从数组中删除具有重复值的行。例如,上述数组的结果应为: 我不确定如何使用numpy有效地做到这一点而无需循环(数组可能会很大)。有人知道我该怎么做吗? 问题答案: 这是一个选择:
问题内容: 我想删除目录中带有扩展名的所有文件。如何在Python中做到这一点? 问题答案: 通过和: 仅使用一个循环: 或通过: 确保位于正确的目录中,并最终使用。
我有一个这样的专栏: 我希望专栏看起来像这样: 只希望保留重复记录的第一个或最后一个。 目前,我使用的是: 但它不起作用。我错过了什么吗?