【问题标题】:Pandas filter list by using unique pythonPandas 使用独特的 python 过滤列表
【发布时间】:2019-07-12 14:46:58
【问题描述】:

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

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()yet,因为它是一个列表列。它不会起作用。

提前谢谢你

【问题讨论】:

  • 明确一点,您只需要 Cat1 的 A 和 C 行对吗?

标签: python pandas


【解决方案1】:

在 python 中lists 不是哈希表,因此需要将它们转换为tuples 或strings,然后使用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]

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2016-11-10
    • 2014-04-19
    • 2020-01-03
    • 2018-01-29
    • 1970-01-01
    • 2019-07-26
    • 2018-12-27
    • 2020-01-16
    相关资源
    最近更新 更多