Pandas:如果某个特定列的总计数仅出现1tim,则删除数据帧中的行

2024-09-30 01:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

原始表格示例(为便于说明,数值是任意的):

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
9    Bolivia     #McDonalds      3456
10   Kenya       #Schools        3455
11   Ukraine     #Cars           3456
12   US          #Tshirts        3456789

预期结果:

^{pr2}$

我知道df.Series.value_counts()>1将标识出哪个{}出现了不止一次;返回的代码将如下所示:

     Population 
           True
     GDP
           True
     #McDonalds
          False
     #Schools
          False
     #Cars
          False
     #Tshirts
          False

我想写一些类似下面的东西,这样我的新DataFrame将列值从数据框系列只发生一次,但这不起作用: df.drop(df.Series.value_counts()==1,axis=1,inplace=True)


Tags: 数据falsetruedfcarsseriesuspopulation
2条回答

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

创建数据集:

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()})

删除列(在本例中为“Series”)的计数为1的行:

^{pr2}$

您可以通过列表理解或使用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列的值是否包含给定的字符串或匹配给定的正则表达式(在本例中使用多个字符串时使用):

^{pr2}$

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

作为补充说明,我建议避免使用单词Series作为列名,因为这是pandas对象的名称。在

相关问题 更多 >

    热门问题