python - Pandas:为太频繁或太稀有的值过滤数据框

标签 python pandas filtering selection

在 pandas 数据框上,我知道我可以对一列或多列进行分组,然后过滤出现次数多于/少于给定数字的值。

但我想在数据框的每一列上执行此操作。我想删除太少的值(比方说出现次数少于 5%)或太频繁的值。例如,考虑一个包含以下列的数据框:出发城市、目的地城市、距离、交通类型(飞机/汽车/步行)、一天中的时间、价格区间

import pandas as pd
import string
import numpy as np
vals = [(c, np.random.choice(list(string.lowercase), 100, replace=True)) for c in 
    'city of origin', 'city of destination', 'distance, type of transport (air/car/foot)', 'time of day, price-interval']
df = pd.DataFrame(dict(vals))
>> df.head()
    city of destination     city of origin  distance, type of transport (air/car/foot)  time of day, price-interval
0   f   p   a   n
1   k   b   a   f
2   q   s   n   j
3   h   c   g   u
4   w   d   m   h

如果这是一个大数据框,则删除包含虚假项的行是有意义的,例如,如果 time of day = night 仅出现 3% 的时间,或者如果 交通工具很少见,等等。

我想从所有列(或列列表)中删除所有此类值。我的一个想法是在每一列上执行 value_countstransform 并为每个 value_counts 添加一列;然后根据它们是高于还是低于阈值进行过滤。但我认为必须有更好的方法来实现这一点?

最佳答案

此过程将遍历 DataFrame 的每一列并消除给定类别小于给定阈值百分比的行,从而在每个循环中缩小 DataFrame。

这个答案与@Ami Tavory 提供的答案类似,但有一些细微差别:

  • 它标准化了值计数,因此您可以只使用百分位阈值。
  • 它每列只计算一次计数,而不是两次。这样可以加快执行速度。

代码:

threshold = 0.03
for col in df:
    counts = df[col].value_counts(normalize=True)
    df = df.loc[df[col].isin(counts[counts > threshold].index), :]

代码时序:

df2 = pd.DataFrame(np.random.choice(list(string.lowercase), [1e6, 4], replace=True), 
                   columns=list('ABCD'))

%%timeit df=df2.copy()
threshold = 0.03
for col in df:
    counts = df[col].value_counts(normalize=True)
    df = df.loc[df[col].isin(counts[counts > threshold].index), :]

1 loops, best of 3: 485 ms per loop

%%timeit df=df2.copy()
m = 0.03 * len(df)
for c in df:
    df = df[df[c].isin(df[c].value_counts()[df[c].value_counts() > m].index)]

1 loops, best of 3: 688 ms per loop

关于python - Pandas:为太频繁或太稀有的值过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303946/

相关文章:

python - 当在应用中也计算前一个值时,Pandas 中是否可以使用 dataframe.apply 中的前一行值?

python - 动态 pandas 数据帧生成

python - 关于scipy.signal中savgol_filter函数参数的一些疑问

python - 如何一次将函数应用于 Pandas 数据框中的多列

Pandas- 根据条件从 DataFrame 中选择行

python - from X import Y 在终端中有效,但在从终端执行的脚本中无效

python - 嵌套的 python 装饰器?

python - 如何在 Python 中部分转置 CSV 表

python - 导入错误 : No module named pymssql error when run from batch file

Python 类型提示 - 更好的 cast() 语法?