按汇总布尔值过滤Pandas数据框

时间:2018-07-15 04:11:34

标签: python pandas filter python-3.6

我正在使用相对较大的数据集(〜400,000 x 76)。我想根据汇总列表过滤数据集。下面的简化示例:

full_list ={
            'bob':1,'rick':1,'jim':1,'tim':1,'bob':1,
            'janet':1,'denise':1,'bob':1,'jim':1,'jessica':1}
nameDF = pd.DataFrame({
            'Name':full_list.keys(), 
            'Value':full_list.values()})
big_names = nameDF.Name.value_counts() > 1

big_names returns [True, False, True, False, False, False, False]

我想使用big_names的结果来过滤full_list。基本上,我想过滤原始数据帧以仅显示与布尔值聚合列表的结果有关的数据。请帮忙!

1 个答案:

答案 0 :(得分:0)

我认为需要从DataFrame或其他方式创建list,因为dictionary在设计上不支持重复键:

full_list = ['bob','rick','jim','tim','bob','janet','denise','bob','jim','jessica']
nameDF = pd.DataFrame({'Name':full_list}) 
print (nameDF)
      Name
0      bob
1     rick
2      jim
3      tim
4      bob
5    janet
6   denise
7      bob
8      jim
9  jessica

然后用GroupBy.transform过滤与原始DataFrame大小相同的返回计数,因此可以用boolean indexing过滤:

big_names = nameDF[nameDF.groupby('Name')['Name'].transform('size') > 1 ]
print (big_names)
  Name
0  bob
2  jim
4  bob
7  bob
8  jim

详细信息

print (nameDF.groupby('Name')['Name'].transform('size'))
0    3
1    1
2    2
3    1
4    3
5    1
6    1
7    3
8    2
9    1
Name: Name, dtype: int64

print (nameDF.groupby('Name')['Name'].transform('size') > 1)
0     True
1    False
2     True
3    False
4     True
5    False
6    False
7     True
8     True
9    False
Name: Name, dtype: bool