在本文中,我们将详细介绍基于2列同时删除python中数据集中的重复项的各个方面,并为您提供关于python两列表删除重复项的相关解答,同时,我们也将为您带来关于Leetcode26.删除排序数组中的
在本文中,我们将详细介绍基于2列同时删除python中数据集中的重复项的各个方面,并为您提供关于python两列表删除重复项的相关解答,同时,我们也将为您带来关于Leetcode 26.删除排序数组中的重复项 By Python、Leetcode 80.删除排序数组中的重复项 II By Python、Pythom-删除列表中的重复项、python – Pandas:枚举索引中的重复项的有用知识。
本文目录一览:- 基于2列同时删除python中数据集中的重复项(python两列表删除重复项)
- Leetcode 26.删除排序数组中的重复项 By Python
- Leetcode 80.删除排序数组中的重复项 II By Python
- Pythom-删除列表中的重复项
- python – Pandas:枚举索引中的重复项
基于2列同时删除python中数据集中的重复项(python两列表删除重复项)
如何解决基于2列同时删除python中数据集中的重复项?
我有一个 Pandas 数据框,希望根据 2 个特定列的条目是否重复来删除行,从第一行开始向下进行(保留第一个命中并删除其他重复项)。
例如从:
Group_1 | Group_2 | 分数 |
---|---|---|
红色 | 蓝色 | 90 |
红色 | 橙色 | 85 |
红色 | 紫罗兰 | 82 |
绿色 | 蓝色 | 79 |
绿色 | 黄色 | 74 |
并且有一个所有条目都是唯一的输出(同时考虑两列 - 第四行被删除,因为第二列中的“蓝色”已经存在于第一行中):
Group_1 | Group_2 | 得分 |
---|---|---|
红色 | 蓝色 | 90 |
绿色 | 黄色 | 74 |
解决方法
我不知道以 col1 OR col2 方式而不是 AND 方式删除重复项的任何直接方法,但是您可以简单地使用 for 循环来按顺序删除您想要的列上的重复项。
for col in [''Group_1'',''Group_2'']:
df.drop_duplicates(subset=col,inplace=True)
或
for col in df.columns[:2]:
df.drop_duplicates(subset=col,inplace=True)
它还会自动保留第一次出现,但您可以在方法中指定它:
df.drop_duplicates(subset=col,inplace=True,keep=''first'')
Leetcode 26.删除排序数组中的重复项 By Python
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以**“引用”**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
思路
设立2个指针i,j。跑得快的指针j会在遇到不是重复的元素的时候停下来,此时i+1进行赋值。如此遍历即可。
Code
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
j = 0
while j < len(nums)-1:
if nums[j] == nums[j+1]:
j += 1
else:
i += 1
nums[i] = nums[j+1]
j += 1
return len(set(nums)) #去重后返回长度
Leetcode 80.删除排序数组中的重复项 II By Python
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以**“引用”**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
思路
用了一个较为笨拙的方法:
利用$collections.Counter$类来计算每个数字出现的次数,再将其中大于2的赋值为2,最后还原为list就好了
代码
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
d = collections.Counter(nums)
for key,value in d.items():
if value > 2:
d[key] = 2
nums[:] = sorted(d.elements())
return len(nums)
虽然可以过,但是效率不高,看到最好的代码是
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
for e in nums:
if i < 2 or e != nums[i-2]:
nums[i] = e
i += 1
return i
Pythom-删除列表中的重复项
编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道该怎么办。
def remove_duplicates(): t = [''a'', ''b'', ''c'', ''d''] t2 = [''a'', ''c'', ''d''] for t in t2: t.append(t.remove()) return t
答案1
小编典典获取唯一项目集合的常用方法是使用set
。集是不同对象的无序集合。要从任何迭代创建集合,只需将其传递给内置函数即可。如果以后再次需要真实列表,则可以类似地将集合传递给函数。set()list()
以下示例应涵盖你尝试做的所有事情:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]>>> t[1, 2, 3, 1, 2, 5, 6, 7, 8]>>> list(set(t))[1, 2, 3, 5, 6, 7, 8]>>> s = [1, 2, 3]>>> list(set(t) - set(s))[8, 5, 6, 7]
从示例结果中可以看出,原始订单未得到维护。如上所述,集合本身是无序集合,因此顺序丢失。将集合转换回列表时,将创建任意顺序。
维持秩序
如果订单对你很重要,那么你将不得不使用其他机制。一个非常常见的解决方案是OrderedDict在插入期间依靠保持键的顺序:
>>> from collections import OrderedDict>>> list(OrderedDict.fromkeys(t))[1, 2, 3, 5, 6, 7, 8]
从Python 3.7开始,可以确保内置字典也保持插入顺序,因此,如果你使用的是Python 3.7或更高版本(或CPython 3.6),也可以直接使用它:
>>> list(dict.fromkeys(t))[1, 2, 3, 5, 6, 7, 8]
请注意,这可能会产生一些开销,先创建字典,然后再从中创建列表。如果你实际上不需要保留订单,那么通常最好使用一组,特别是因为它可以为你提供更多操作。请查看此问题,以获取更多详细信息以及删除重复项时保留订单的其他方法。
最后请注意,解决方案set
和OrderedDict/ dict
解决方案都要求你的项目是可哈希的。这通常意味着它们必须是不变的。如果必须处理不可散列的项目(例如列表对象),则必须使用慢速方法,在这种方法中,你基本上必须将每个项目与嵌套循环中的所有其他项目进行比较。
python – Pandas:枚举索引中的重复项
data = [ {"key": "A","event": "created"},{"key": "A","event": "updated"},{"key": "B",{"key": "C",] df = pandas.DataFrame(data)
我想首先在键上索引我的DataFrame,然后是枚举.它看起来像一个简单的unstack操作,但我无法找到如何正确地执行它.
我能做的最好的是
df.set_index("key",append=True).swaplevel(0,1) event key A 0 created 1 updated 2 updated 3 updated B 4 created 5 updated 6 updated C 7 created 8 updated 9 updated 10 updated 11 updated 12 updated
但我期待的是
event key A 0 created 1 updated 2 updated 3 updated B 0 created 1 updated 2 updated C 0 created 1 updated 2 updated 3 updated 4 updated 5 updated
我也尝试了类似的东西
df.groupby("key")["key"].count().apply(range).apply(pandas.Series).stack()
但订单未保留,因此我无法将结果应用为索引.此外,我觉得看起来非常标准的操作有点过分了……
任何的想法?
解决方法
以下是几种方法:
# new version thanks @ScottBoston df = df.set_index(['key',df.groupby('key').cumcount()])\ .rename_axis(['key','count']) # original version df = df.assign(count=df.groupby('key').cumcount())\ .set_index(['key','count']) print(df) event key count A 0 created 1 updated 2 updated 3 updated B 0 created 1 updated 2 updated C 0 created 1 updated 2 updated 3 updated 4 updated 5 updated
今天关于基于2列同时删除python中数据集中的重复项和python两列表删除重复项的介绍到此结束,谢谢您的阅读,有关Leetcode 26.删除排序数组中的重复项 By Python、Leetcode 80.删除排序数组中的重复项 II By Python、Pythom-删除列表中的重复项、python – Pandas:枚举索引中的重复项等更多相关知识的信息可以在本站进行查询。
本文标签: