Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas:Pandas groupby过滤器可以在原始对象上工作吗?_Python_Pandas_Filter_Group By - Fatal编程技术网

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循环。我不确定我是否理解您所追求的关于“删除键”和“删除键”之间区别的细微差别。我有另一个想法,应该会很有成效。给我几分钟