通过使用唯一的python熊猫过滤器列表

时间:2019-07-12 06:37:53

标签: python pandas

我有一个类似于下面的数据框

df = pd.DataFrame.from_dict({'cat1':['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D'], 'cat2':[['X','Y'], ['F'], ['X','Y'], ['Y'], ['Y'], ['Y'], ['Z'], ['P','W'],['L','K'],['L','K'],['L','K']]})

输出为

   cat1    cat2
0     A  [X, Y]
1     A     [F]
2     A  [X, Y]
3     B     [Y]
4     B     [Y]
5     C     [Y]
6     C     [Z]
7     C  [P, W]
8     D  [L, K]
9     D  [L, K]
10    D  [L, K]

我想过滤掉B和D,B和D仅包含'Y'和['L','K']。

所需的输出:

   cat1    cat2
0     A  [X, Y]
1     A     [F]
2     A  [X, Y]
3     C     [Y]
4     C     [Z]
5     C  [P, W]

我已经尝试df.groupby(['cat1'])['cat2'].unique(),因为它是一个列表列。它不起作用。

提前谢谢

1 个答案:

答案 0 :(得分:2)

在python中,list是不可哈希表的,因此有必要将它们转换为tuplestring s,然后将GroupBy.transformSeriesGroupBy.nunique一起使用并按不等于Series.neboolean indexing

df = df[df['cat2'].apply(tuple).groupby(df['cat1']).transform('nunique').ne(1)]
#alternative
#df = df[df['cat2'].astype('str').groupby(df['cat1']).transform('nunique').ne(1)]
print (df)
  cat1    cat2
0    A  [X, Y]
1    A     [F]
2    A  [X, Y]
5    C     [Y]
6    C     [Z]
7    C  [P, W]