Python:在计数条件下删除行

Posted

技术标签:

【中文标题】Python:在计数条件下删除行【英文标题】:Python: Removing Rows on Count condition 【发布时间】:2018-09-19 00:19:51 【问题描述】:

我在过滤 pandas 数据帧时遇到问题。

city 
NYC 
NYC 
NYC 
NYC 
SYD 
SYD 
SEL 
SEL
...

df.city.value_counts()

我想删除计数频率低于 4 的城市行,例如 SYD 和 SEL。

如果不逐个城市手动删除它们,该怎么做?

【问题讨论】:

什么是dropping them city by city?也许你应该提供你的工作代码。和你想要的。 我认为可以通过使用 df.drop(['SYD']) 来做到这一点,但不起作用。 【参考方案1】:

这是使用pd.Series.value_counts 的一种方式。

counts = df['city'].value_counts()

res = df[~df['city'].isin(counts[counts < 5].index)]

counts 是一个 pd.Series 对象。 counts &lt; 5 返回一个布尔系列。我们通过布尔 counts &lt; 5 系列过滤计数系列(这就是方括号实现的效果)。然后,我们采用结果系列的索引来查找计数小于 5 的城市。 ~ 是否定运算符。

请记住,系列是索引和值之间的映射。系列的索引不一定包含唯一值,但value_counts 的输出保证了这一点。

【讨论】:

非常感谢!现在我要研究'~'的含义 @DevinLee,这仅表示向量化函数中的元素“否定”/“否定”。 我不明白这部分counts[counts &lt; 5].index。你能详细说明一下吗? @Snow,counts 是一个 pd.Series 对象。 counts &lt; 5 返回一个布尔系列。我们通过布尔 counts &lt; 5 系列过滤 counts 系列(这就是方括号实现的功能)。然后,我们采用结果系列的索引来查找计数小于 5 的城市。请记住,系列是索引和值之间的映射。索引不一定包含唯一值,但使用value_counts 可以保证这一点。【参考方案2】:

我想你在找value_counts()

# Import the great and powerful pandas
import pandas as pd

# Create some example data
df = pd.DataFrame(
    'city': ['NYC', 'NYC', 'SYD', 'NYC', 'SEL', 'NYC', 'NYC']
)

# Get the count of each value
value_counts = df['city'].value_counts()

# Select the values where the count is less than 3 (or 5 if you like)
to_remove = value_counts[value_counts <= 3].index

# Keep rows where the city column is not in to_remove
df = df[~df.city.isin(to_remove)]

【讨论】:

【参考方案3】:

这里有过滤器

df.groupby('city').filter(lambda x : len(x)>3)
Out[1743]: 
  city
0  NYC
1  NYC
2  NYC
3  NYC

解决方案二transform

sub_df = df[df.groupby('city').city.transform('count')>3].copy() 
# add copy for future warning when you need to modify the sub df

【讨论】:

这是一个很棒的单班轮!我真的应该更多地使用groupby,目前它对我来说仍然是一种黑魔法。 不错的一个。不幸的是,lambda 会让我生病 :(。只有小剂量才好! @jpp 是的,对于小样本,我认为过滤器更清晰,但仅适用于小样本 在 100 万行数据帧上测试,jpp 的 value_counts 解决方案比 filter 略快,但 transform 解决方案比两者都快得多(后者耗时不到 1s在我的数据集上,其他人分别用了 5.7 秒和 8.3 秒)。【参考方案4】:

另一种解决方案:

threshold=3
df['Count'] = df.groupby('City')['City'].transform(pd.Series.value_counts)
df=df[df['Count']>=threshold]
df.drop(['Count'], axis = 1, inplace = True)
print(df)

  City
0  NYC
1  NYC
2  NYC
3  NYC

【讨论】:

不幸的是,这个解决方案比其他解决方案慢得多。

以上是关于Python:在计数条件下删除行的主要内容,如果未能解决你的问题,请参考以下文章

红移。在条件下删除表

r - 如果下面的行包含一个值,则从计数中删除

删除后休眠意外行数上升

python 按条件删除行

如何根据python中的多个条件对excel文件进​​行重复数据删除?

excel vba 删除行直到条件