【问题标题】:Remove low frequency values from pandas.dataframe从 pandas.dataframe 中删除低频值
【发布时间】:2019-04-07 21:37:47
【问题描述】:

如何从pandas.DataFrame 中的列中删除很少发生(即频率较低)的值?示例:

In [4]: df[col_1].value_counts()

Out[4]: 0       189096
        1       110500
        2        77218
        3        61372
              ...
        2065         1
        2067         1
        1569         1
        dtype: int64

所以,我的问题是:如何删除 2065, 2067, 1569 等值?我怎样才能对所有包含 .value_counts() 这样的列执行此操作?

更新:关于“低”,我的意思是像 2065 这样的值。这个值出现在col_1 1(一)次,我想删除这样的值。

【问题讨论】:

  • “很少见面”是什么意思?你可以说得更详细点吗?添加一些您已经尝试过的代码可能会有所帮助。
  • 我不明白怎么能“更具体”?在col_1 值中,如0 遇到189096 次。并且像1569 这样的价值会见一次。我想在col_1 中删除1569 和其他类似的值。
  • 啊哈!你的意思是“发生”,而不是“满足”。
  • 现在,如果你提供一段自包含的代码来生成类似的数据结构,那么想出答案会容易得多。
  • 好的。我的英语不好,我知道。但我正在努力解决它=)。那么,我的问题呢?

标签: python pandas


【解决方案1】:

我知道您可能希望通过两种方式来做到这一点。

对于整个DataFrame

此方法会删除整个 DataFrame 中不常出现的值。我们可以在没有循环的情况下使用内置函数来加快速度。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, high=9, size=(100,2)),
         columns = ['A', 'B'])

threshold = 10 # Anything that occurs less than this will be removed.
value_counts = df.stack().value_counts() # Entire DataFrame 
to_remove = value_counts[value_counts <= threshold].index
df.replace(to_remove, np.nan, inplace=True)

逐列

此方法会删除每列中不常出现的条目。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, high=9, size=(100,2)),
         columns = ['A', 'B'])

threshold = 10 # Anything that occurs less than this will be removed.
for col in df.columns:
    value_counts = df[col].value_counts() # Specific column 
    to_remove = value_counts[value_counts <= threshold].index
    df[col].replace(to_remove, np.nan, inplace=True)

【讨论】:

  • 嗨,我错过了一段逻辑,有人可以解释一下为什么你需要“.index”(或下面的“.values”)来让代码工作,TIA
  • @eli - 这是因为 value_counts 是一个系列,而 .index 是您要删除的值。
【解决方案2】:

如果只有一列的值低于您的阈值,您可能不想删除 DataFrame 中的整行,因此我只是删除了这些数据点并将它们替换为 None

我遍历每一列并对每一列执行value_counts。然后,我得到每个出现在目标阈值或低于目标阈值的项目的索引值。最后,我使用.loc在列中定位这些元素值,然后将它们替换为None

df = pd.DataFrame({'A': ['a', 'b', 'b', 'c', 'c'], 
                   'B': ['a', 'a', 'b', 'c', 'c'], 
                   'C': ['a', 'a', 'b', 'b', 'c']})

>>> df
   A  B  C
0  a  a  a
1  b  a  a
2  b  b  b
3  c  c  b
4  c  c  c

threshold = 1  # Remove items less than or equal to threshold
for col in df:
    vc = df[col].value_counts()
    vals_to_remove = vc[vc <= threshold].index.values
    df[col].loc[df[col].isin(vals_to_remove)] = None

>>> df
      A     B     C
0  None     a     a
1     b     a     a
2     b  None     b
3     c     c     b
4     c     c  None

【讨论】:

  • 谢谢!这正是我问的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多