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

时间:2015-04-24 00:48:32

标签: python pandas filtering dataframe

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

帮助?

4 个答案:

答案 0 :(得分:49)

使用groupby filter

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

我建议您阅读split-combine-section of the docs

答案 1 :(得分:0)

效果更好的解决方案应该是GroupBy.transform,其中size的每个组的数量要与原始df相同,因此可能要用boolean indexing进行过滤:

df1 = df[df.groupby("A")['A'].transform('size') > 1]

或将Series.mapSeries.value_counts一起使用:

df1 = df[df['A'].map(df['A'].value_counts()) > 1]

答案 2 :(得分:0)

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

例如,如果数据集是:

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

将计数转换并保存为字典

ount_freq = dict(df['a'].value_counts())

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

df['count_freq'] = df['a']
df['count_freq'] = df['count_freq'].map(count_freq)

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

df[df.count_freq>1]

答案 3 :(得分:0)

此外,如果您想过滤并拥有“计数”列:

attr = 'A'
limit = 10
df2 = df.groupby(attr)[attr].agg(count='count')
df2 = df2.loc[df2['count'] > limit].reset_index()
print(df2)

#outputs rows with grouped 'A' count > 10 and columns ==> index, count, A