我有一个类似于下面的数据框
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()
,因为它是一个列表列。它不起作用。
提前谢谢
答案 0 :(得分:2)
在python中,list
是不可哈希表的,因此有必要将它们转换为tuple
或string
s,然后将GroupBy.transform
与SeriesGroupBy.nunique
一起使用并按不等于Series.ne
和boolean 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]