人们, 我偶尔会涉猎熊猫-但我不能声称自己拥有丰富的知识。今天,我不得不根据某个列中某个值的出现从 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
但是我敢打赌,有适当的方法可以实现相同的目标。
任何人都可以提出更泛泛的解决方案吗?!
预先感谢
答案 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)