Python 熊猫:如果某个特定列的总计数仅出现1次,则删除数据帧的行

Python 熊猫:如果某个特定列的总计数仅出现1次,则删除数据帧的行,python,pandas,Python,Pandas,如果某个特定列的总计数仅出现1次,我希望删除数据帧的行 原始表格示例(为了说明目的,值是任意的): 预期结果: print df Country Series Value 0 Bolivia Population 123 1 Kenya Population 1234 2 Ukraine Population 12345 3 US Population

如果某个特定列的总计数仅出现1次,我希望删除数据帧的行

原始表格示例(为了说明目的,值是任意的):

预期结果:

print df

     Country     Series          Value
0    Bolivia     Population      123
1    Kenya       Population      1234
2    Ukraine     Population      12345
3    US          Population      123456
5    Bolivia     GDP             23456
6    Kenya       GDP             234567
7    Ukraine     GDP             2345678
8    US          GDP             23456789
我知道
df.Series.value_counts()>1
将识别哪个
df.Series
出现超过1次;返回的代码如下所示:

     Population 
           True
     GDP
           True
     #McDonalds
          False
     #Schools
          False
     #Cars
          False
     #Tshirts
          False
我想编写如下内容,以便我的新DataFrame从只出现1次的df.Series中删除列值,但这不起作用:
df.drop(df.Series.value_counts()=1,axis=1,inplace=True)
您可以通过列表理解或使用
DataFrame
的字符串操作方法创建布尔列表/数组来实现这一点

列表理解方法是:

vc = df['Series'].value_counts()
u  = [i not in set(vc[vc==1].index) for i in df['Series']]
df = df[u]
另一种方法是使用
str.contains
方法检查
Series
列的值是否包含给定的字符串或匹配给定的正则表达式(在本例中使用,因为我们使用多个字符串):

使用这种正则表达式的方法有点老土,可能需要在
pat
上进行一些额外的处理(字符转义等),以防您想要过滤掉的字符串中有正则表达式元字符(这需要一些基本的正则表达式知识)。然而,值得注意的是,这种方法比使用列表理解方法(根据问题中提供的数据进行测试)快4倍左右


作为旁注,我建议避免将单词
Series
用作列名,因为这是pandas对象的名称。

您可以通过列表理解或使用
DataFrame
的字符串操作方法创建布尔列表/数组来实现这一点

列表理解方法是:

vc = df['Series'].value_counts()
u  = [i not in set(vc[vc==1].index) for i in df['Series']]
df = df[u]
另一种方法是使用
str.contains
方法检查
Series
列的值是否包含给定的字符串或匹配给定的正则表达式(在本例中使用,因为我们使用多个字符串):

使用这种正则表达式的方法有点老土,可能需要在
pat
上进行一些额外的处理(字符转义等),以防您想要过滤掉的字符串中有正则表达式元字符(这需要一些基本的正则表达式知识)。然而,值得注意的是,这种方法比使用列表理解方法(根据问题中提供的数据进行测试)快4倍左右


作为补充说明,我建议避免使用
系列
作为列名,因为这是熊猫对象的名称。

这是一个老问题,但当前的答案不适用于任何中等大小的数据帧。一种更快更“数据帧”的方法是添加一个值计数列并过滤掉计数

创建数据集:

df = pd.DataFrame({'Country': 'Bolivia Kenya Ukraine US Bolivia Kenya Ukraine US Bolivia Kenya Ukraine US'.split(),
                   'Series': 'Pop Pop Pop Pop GDP GDP GDP GDP McDonalds Schools Cars Tshirts'.split()})
删除列计数小于1的行(在本例中为“系列”):


这是一个老问题,但目前的答案不适用于任何中等规模的数据帧。一种更快更“数据帧”的方法是添加一个值计数列并过滤掉计数

创建数据集:

df = pd.DataFrame({'Country': 'Bolivia Kenya Ukraine US Bolivia Kenya Ukraine US Bolivia Kenya Ukraine US'.split(),
                   'Series': 'Pop Pop Pop Pop GDP GDP GDP GDP McDonalds Schools Cars Tshirts'.split()})
删除列计数小于1的行(在本例中为“系列”):


谢谢你的帮助,@Gustavo!我刚刚尝试了这个解决方案,但不幸的是没有成功。下面是错误的后半部分:
//anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in get_value(self,series,key)1802 raise InvalidIndexError(key)1803其他:->1804 raise e1 1805例外情况除外:#pragma:无封面1806 raise e1 KeyError:“主题”
根据您的建议,我将我的列
Series
的值更改为
Topic
看起来像是一个关键错误。确保列的名称正确,并且确实有一个名为
'Topic'
的列。我只是重新测试了我的答案,看起来还不错。这是伊皮顿垃圾场:再次感谢,@Gustavo。现在出现以下错误:`/anaconda/lib/python2.7/site-packages/ipykernel/_-main.py:3:UserWarning:此模式具有匹配组。要实际获取组,请使用str.extract。app.launch_new_instance()`这个错误来自这里:我怀疑您的正则表达式中有一些有问题的字符(可能是
)。你能告诉我pat看起来是什么样子吗?正如所料,这里有一堆regex元字符。我已经编辑了我的答案,并添加了另一种使用列表理解的方法(稍微慢一点),希望对您有用。谈论regex方法会有点离题。谢谢你的帮助,@Gustavo!我刚刚尝试了这个解决方案,但不幸的是没有成功。下面是错误的后半部分:
//anaconda/lib/python2.7/site-packages/pandas/core/index.pyc in get_value(self,series,key)1802 raise InvalidIndexError(key)1803其他:->1804 raise e1 1805例外情况除外:#pragma:无封面1806 raise e1 KeyError:“主题”
根据您的建议,我将我的列
Series
的值更改为
Topic
看起来像是一个关键错误。确保列的名称正确,并且确实有一个名为
'Topic'
的列。我只是重新测试了我的答案,看起来还不错。这是伊皮顿垃圾场:再次感谢,@Gustavo。现在出现以下错误:`/anaconda/lib/python2.7/site-packages/ipykernel/_-main.py:3:UserWarning:此模式具有匹配组。要实际获取组,请使用str.extract。app.launch_new_instance()`这个错误来自这里:我怀疑您的正则表达式中有一些有问题的字符(可能是
)。你能给我看看帕特长什么样吗?正如所料,这里有一堆注册码
# Group values for Series and add 'cnt' column with count
df['cnt'] = df.groupby(['Series'])['Country'].transform('count')
# Drop indexes for count value == 1, and dropping 'cnt' column
df.drop(df[df.cnt==1].index)[['Country','Series']]