【问题标题】:Remove groups from a DataFrame that contain only a single unique value in one column从 DataFrame 中删除仅在一列中包含单个唯一值的组
【发布时间】:2020-09-01 15:38:45
【问题描述】:

我正在使用 Pandas 处理数据。 “A”是唯一的 ID 列,“E”列包含 10。我只想保留列 E 的值同时包含 0 和 1 的组。(我想删除列 A 为 2 和 4 的行,因为这些组分别只包含 1 和 0,只留下列 A 为 1 的行, 3、5)。

最好的方法是什么?

    A   B   C   D   E   F
1   1   0   0   0   1   1163.7
2   1   0.8 0.8 2.2 0   0
3   1   0.2 0.2 4.4 0   0
4   1   0.8 0.4 0.4 0   0
5   1   0.5 0.7 3.8 0   0
6   2   1   1   8.9 1   116
7   2   1.5 1.5 1.7 1   116
8   2   2   2   8.7 1   116
9   3   3   3   5.  0   0
10  3   4.5 4.5 2.2 0   0
11  3   6.0 6.5 0.8 0   0
12  3   8   8   0.3 0   0
13  3   5.3 0   0   1   116
14  3   0   0   0   1   116
15  4   0.8 0.8 1.1 0   0
16  4   0.2 0.5 3.4 0   0
17  4   0.4 0.8 3.2 0   0
18  4   0.7 0.5 3.0 0   0
19  5   1   1   1.5 0   0
20  5   1.5 1.5 1.7 0   0
21  5   2   2   7.9 1   116

我想获取以下数据。

       A   B   C   D   E   F

1   1   0   0   0   1   1163.7
2   1   0.8 0.8 2.2 0   0
3   1   0.2 0.2 4.4 0   0
4   1   0.8 0.4 0.4 0   0
5   1   0.5 0.7 3.8 0   0
6   3   3   3   2.2 0   0
7   3   4.5 4.5 2.2 0   0
8   3   6.0 6.5 0.8 0   0
9   3   8   8   0.3 0   0
10  3   5.3 0   0   1   116
11  3   0   0   0   1   116
12  5   1   1   1.5 0   0
13  5   1.5 1.5 1.7 0   0
14  5   2   2   7.9 1   116

【问题讨论】:

  • 请提供我们可以用来轻松复制您的数据框的输入

标签: python pandas


【解决方案1】:

在列Etransform 上使用Series.groupby,使用any 创建布尔掩码:

m = (df['E'].eq(0).groupby(df['A']).transform('any') &
     df['E'].eq(1).groupby(df['A']).transform('any'))
df1 = df[m]

如果列 E 仅包含零和一,或者另一个想法,

m = df.groupby('A')['E'].nunique().eq(2)
df1 = df[df['A'].isin(m[m].index)]

结果:

print(df1)
    A    B    C    D  E       F
1   1  0.0  0.0  0.0  1  1163.7
2   1  0.8  0.8  2.2  0     0.0
3   1  0.2  0.2  4.4  0     0.0
4   1  0.8  0.4  0.4  0     0.0
5   1  0.5  0.7  3.8  0     0.0
9   3  3.0  3.0  5.0  0     0.0
10  3  4.5  4.5  2.2  0     0.0
11  3  6.0  6.5  0.8  0     0.0
12  3  8.0  8.0  0.3  0     0.0
13  3  5.3  0.0  0.0  1   116.0
14  3  0.0  0.0  0.0  1   116.0
19  5  1.0  1.0  1.5  0     0.0
20  5  1.5  1.5  1.7  0     0.0
21  5  2.0  2.0  7.9  1   116.0

【讨论】:

    【解决方案2】:

    您可以在 A 和 E 列和 groupby.size 上使用 drop_duplicates 来查看 A 的组在哪里有 2 个不同的元素,因为 E 只有 0 或 1。然后使用大小等于 2 的索引,例如:

    s = df[['A','E']].drop_duplicates().groupby('A').size()
    df_ = df[df['A'].isin(s[s.eq(2)].index)].copy()
    print(df_)
        A    B    C    D  E       F
    1   1  0.0  0.0  0.0  1  1163.7
    2   1  0.8  0.8  2.2  0     0.0
    3   1  0.2  0.2  4.4  0     0.0
    4   1  0.8  0.4  0.4  0     0.0
    5   1  0.5  0.7  3.8  0     0.0
    9   3  3.0  3.0  5.0  0     0.0
    10  3  4.5  4.5  2.2  0     0.0
    11  3  6.0  6.5  0.8  0     0.0
    12  3  8.0  8.0  0.3  0     0.0
    13  3  5.3  0.0  0.0  1   116.0
    14  3  0.0  0.0  0.0  1   116.0
    19  5  1.0  1.0  1.5  0     0.0
    20  5  1.5  1.5  1.7  0     0.0
    21  5  2.0  2.0  7.9  1   116.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多