在DataFrame中缩小非代表性数据的大小

时间:2018-09-28 12:27:10

标签: python-3.x pandas dataframe

人们, 我偶尔会涉猎熊猫-但我不能声称自己拥有丰富的知识。今天,我不得不根据某个列中某个值的出现从 DataFrame 中过滤掉一些行。例如,在此简化示例中

In [57]: table = pd.DataFrame([[2, 'a'], [3, 'b'], [2, 'c'], [4, 'd'], [4, 'e'], [5, 'f']], 
...:                      columns=('group', 'letter'))
...: print(table)
...:                      
   group letter
0      2      a
1      3      b
2      2      c
3      4      d
4      4      e
5      5      f

我想过滤出在 group 列中带有一个值的行,该值在 DataFrame 中仅出现一次。

我通过这种巧妙的解决方法解决了这个问题(再次,这只是一个例子)

In [58]: pd.concat(df for _, df in table.groupby(by=['group']) if len(df) > 1)
Out[58]: 
   group letter
0      2      a
2      2      c
3      4      d
4      4      e

但是我敢打赌,有适当的方法可以实现相同的目标。

任何人都可以提出更泛泛的解决方案吗?!

预先感谢

1 个答案:

答案 0 :(得分:1)

为获得更好的性能,请使用GroupBy.transform来返回Series,其大小与原始df相同,因此可以用boolean indexing进行过滤:

table = table[table.groupby(by=['group'])['letter'].transform('size') > 1]
print(table)
   group letter
0      2      a
2      2      c
3      4      d
4      4      e

详细信息

print(table.groupby(by=['group'])['letter'].transform('size'))
0    2
1    1
2    2
3    2
4    2
5    1
Name: letter, dtype: int64

在大型DataFrame中使用filter的另一种解决方案应该更慢:

table = table.groupby(by=['group']).filter(lambda x: len(x) > 1)