如何根据值计数过滤pandas DataFrame?

uch*_*jin 38 python filtering dataframe pandas

我正在使用Python的Pandas DataFrame开发视频游戏,每个都有一个类型.我试图删除任何在DataFrame中出现少于几次的类型的视频游戏,但我不知道如何去做.我确实找到了一个似乎相关的StackOverflow问题,但我根本无法破译解决方案(可能是因为我从未听说过R而且我对函数式编程的记忆充其量是生锈的).

救命?

And*_*den 57

使用groupby过滤器:

In [11]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])

In [12]: df
Out[12]:
   A  B
0  1  2
1  1  4
2  5  6

In [13]: df.groupby("A").filter(lambda x: len(x) > 1)
Out[13]:
   A  B
0  1  2
1  1  4
Run Code Online (Sandbox Code Playgroud)

我建议阅读文档split-combine-section.

  • 我们甚至可以通过MultiIndex级别进行分组:groupby(level = ...).正是我所需要的 (2认同)

jez*_*ael 22

性能更好的解决方案应该是GroupBy.transformsize每团体计数系列与像原来一样大小df的,所以可能的过滤器boolean indexing

df1 = df[df.groupby("A")['A'].transform('size') > 1]
Run Code Online (Sandbox Code Playgroud)

或者使用Series.map具有Series.value_counts

df1 = df[df['A'].map(df['A'].value_counts()) > 1]
Run Code Online (Sandbox Code Playgroud)

  • 对于性能方面的价值,我通过“%%timeit”针对上面的“groupby.filter”解决方案运行“Series.map”解决方案,得到以下结果(在主要为 JSON 字符串数据的数据帧上,按字符串分组ID 列):“系列图:每个循环 2.34 ms ± 254 µs”,“Groupby.filter:每个循环 269 ms ± 41.3 ms”。所以 `Series.map` 解决方案要快得多 (4认同)

Aad*_*Ura 5

@jezael 解决方案效果很好,这是一种基于值计数进行过滤的不同方法:

例如,如果数据集是:

df = pd.DataFrame({'a': [1,2,3,3,1,6], 'b': [11,2,33,4,55,6]})
Run Code Online (Sandbox Code Playgroud)

转换计数并将其保存为字典

ount_freq = dict(df['a'].value_counts())
Run Code Online (Sandbox Code Playgroud)

创建一个新列并复制目标列,将字典与新创建的列映射

df['count_freq'] = df['a']
df['count_freq'] = df['count_freq'].map(count_freq)
Run Code Online (Sandbox Code Playgroud)

现在我们有一个带有计数频率的新列,您现在可以使用此列轻松定义阈值和过滤器。

df[df.count_freq>1]
Run Code Online (Sandbox Code Playgroud)