Python Pandas:Pandas groupby过滤器可以在原始对象上工作吗?
以这个问题为基础 我想知道有没有办法通过删除来过滤掉“组”Python Pandas:Pandas groupby过滤器可以在原始对象上工作吗?,python,pandas,filter,group-by,Python,Pandas,Filter,Group By,以这个问题为基础 我想知道有没有办法通过删除来过滤掉“组” 它们来自原始对象g。而且,它会比从过滤的groupby创建一个新的groupby对象更快吗 解决这个问题的方法只有这么多。我的答案包括4个解决方案。我相信,还有其他方法。也许其他一些答案会提供更好的方法 解决方案#1: data = data.groupby('tag').filter(lambda x: len(x) > 1) pid tag 1 1 45 2 1 62 4 2 45 7 3
它们来自原始对象
g
。而且,它会比从过滤的groupby创建一个新的groupby
对象更快吗 解决这个问题的方法只有这么多。我的答案包括4个解决方案。我相信,还有其他方法。也许其他一些答案会提供更好的方法
解决方案#1:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
解决方案#2:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
解决方案#3:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
如果要删除行,可以使用.index.tolist()
然后使用drop()
解决方案#4:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
解决这个问题的方法只有这么多。我的答案包括4个解决方案。我相信,还有其他方法。也许其他一些答案会提供更好的方法 解决方案#1:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
解决方案#2:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
解决方案#3:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
如果要删除行,可以使用.index.tolist()
然后使用drop()
解决方案#4:
data = data.groupby('tag').filter(lambda x: len(x) > 1)
pid tag
1 1 45
2 1 62
4 2 45
7 3 62
data['count'] = data.groupby(['tag']).transform('count')
data.loc[data['count'] == 2]
pid tag count
1 1 45 2
2 1 62 2
4 2 45 2
7 3 62 2
data['count'] = data.groupby(['tag']).transform('count')
g = data.groupby('count')
data.loc[g.groups[2],('tag','pid')]
tag pid
1 45 1
2 62 1
4 45 2
7 62 3
有几个选项(您的位于底部):
第一个是inplace
,我尽可能快。这比您的解决方案快一点,但不是因为将行放置到位。使用第二个选项,我可以获得更好的性能,而这一点不会改变
%%timeit
data = pd.DataFrame(
{'pid' : [1,1,1,2,2,3,3,3],
'tag' : [23,45,62,24,45,34,25,62],
})
mask = ~data.duplicated(subset=['tag'], keep=False)
data.drop(mask[mask].index, inplace=True)
data
1000 loops, best of 3: 1.16 ms per loop
有几个选项(您的位于底部): 第一个是
inplace
,我尽可能快。这比您的解决方案快一点,但不是因为将行放置到位。使用第二个选项,我可以获得更好的性能,而这一点不会改变
%%timeit
data = pd.DataFrame(
{'pid' : [1,1,1,2,2,3,3,3],
'tag' : [23,45,62,24,45,34,25,62],
})
mask = ~data.duplicated(subset=['tag'], keep=False)
data.drop(mask[mask].index, inplace=True)
data
1000 loops, best of 3: 1.16 ms per loop
这与上面的相同——返回一个数据帧。我需要重新创建groupby对象。@Merlin我添加了另一个解决方案。@Joe我正在尝试从data.groupby('tag')对象中删除不需要的键。所以,我可以重复使用它。不要创建另一个“g”对象。@Merlin您可以
drop()
不需要的行。请查看我的编辑..@Joe,因为我有groupby对象,它扫描了数据帧的行。我认为必须有一种方法来删除键,而不是删除-删除行。有意义吗?这和上面的没什么不同——返回一个数据帧。我需要重新创建groupby对象。@Merlin我添加了另一个解决方案。@Joe我正在尝试从data.groupby('tag')对象中删除不需要的键。所以,我可以重复使用它。不要创建另一个“g”对象。@Merlin您可以drop()
不需要的行。请查看我的编辑..@Joe,因为我有groupby对象,它扫描了数据帧的行。我认为必须有一种方法来删除键,而不是删除-删除行。有意义吗?它不是重复删除,而是从分组对象中删除不需要的键。需要分组的对象。groupby filter方法返回一个DF,我必须从返回的DF重新创建groupby对象。重复的“技巧”是一种厚颜无耻的识别重复标记所在行的方法。如果你在寻找一种有效的方法来删除索引,那是另一个问题。我给你拿点东西,不是索引,而是下拉键。。我打算用删除键来强制执行for循环。我不确定我是否理解您所追求的关于“删除键”和“删除键”之间区别的细微差别。我有另一个想法,应该会很有成效。给我几分钟,这不是重复删除,而是从分组对象中删除不需要的关键点。需要分组的对象。groupby filter方法返回一个DF,我必须从返回的DF重新创建groupby对象。重复的“技巧”是一种厚颜无耻的识别重复标记所在行的方法。如果你在寻找一种有效的方法来删除索引,那是另一个问题。我给你拿点东西,不是索引,而是下拉键。。我打算用删除键来强制执行for循环。我不确定我是否理解您所追求的关于“删除键”和“删除键”之间区别的细微差别。我有另一个想法,应该会很有成效。给我几分钟