使用设置值选择 Pandas 数据框

3

假设有一个Pandas Dataframe df,我如何找到同时包含值为6和10的行?

    0   1   2   3   4   5   6
0   11  1   3   4   6   8   10
1   11  1   3   4   6   8   11
2   11  1   3   4   6   8   0
3   11  1   3   4   6   9   10
4   11  1   3   4   6   9   11
5   11  1   3   4   6   9   0
6   11  1   3   4   6   10  10
7   11  1   3   4   6   10  11
8   11  1   3   4   6   10  0
9   11  1   3   4   7   8   10

我可以通过一种基于集合的解决方案获取这些行:

>>> df.iloc[[i for i, s in enumerate(df.itertuples()) if {6, 10} <= set(s)]]

    0   1   2   3   4   5   6
0   11  1   3   4   6   8   10
3   11  1   3   4   6   9   10
6   11  1   3   4   6   10  10
7   11  1   3   4   6   10  11
8   11  1   3   4   6   10  0

我的问题是:在Pandas中是否有更好的方法来获取包含给定值的行中的True?例如:

df.where({6, 10} <= df)

数据示例:
pandas.DataFrame.from_dict({0: {0: 11, 1: 11, 2: 11, 3: 11, 4: 11, 5: 11, 6: 11, 7: 11, 8: 11, 9: 11},
 1: {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1},
 2: {0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3},
 3: {0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4, 7: 4, 8: 4, 9: 4},
 4: {0: 6, 1: 6, 2: 6, 3: 6, 4: 6, 5: 6, 6: 6, 7: 6, 8: 6, 9: 7},
 5: {0: 8, 1: 8, 2: 8, 3: 9, 4: 9, 5: 9, 6: 10, 7: 10, 8: 10, 9: 8},
 6: {0: 10, 1: 11, 2: 0, 3: 10, 4: 11, 5: 0, 6: 10, 7: 11, 8: 0, 9: 10}})

编辑

这个数据框只是我真实数据的一小部分。每行中可以出现0到2次介于0和11之间的整数。例如,在这些行中,值为4、8和11分别出现了两次。

        0   1   2   3   4   5   6
100     11  1   4   4   8   8   11
343     11  2   4   4   8   8   11
505     11  3   3   4   8   8   11
586     11  3   4   4   8   8   11
1558    1   1   4   4   8   8   11

你的数据中是否包含重复的6或10? - Anzel
是的,数据可以包含重复的值。 - msampaio
但是你会有只有重复的6/10的行吗? - EdChum
我不能有一个只有重复的6和10的行。每个值只能有一个重复。我在我的帖子中编辑了一个例子。 - msampaio
1个回答

2
你可以使用isin测试成员资格,然后调用dropna并传递thresh=2以仅显示至少存在2个非NaN值的行:
In [20]:
df[df.isin([6,10])].dropna(thresh=2)

Out[20]:
    0   1   2   3  4   5   6
0 NaN NaN NaN NaN  6 NaN  10
3 NaN NaN NaN NaN  6 NaN  10
6 NaN NaN NaN NaN  6  10  10
7 NaN NaN NaN NaN  6  10 NaN
8 NaN NaN NaN NaN  6  10 NaN

我认为实际上最好是针对每个值进行测试并应用 any

In [41]:
df.apply(lambda x: (x == 6).any() & (x == 10).any(), axis=1)

Out[41]:
0     True
1    False
2    False
3     True
4    False
5    False
6     True
7     True
8     True
9    False
dtype: bool

对于3个值,您可以进行以下操作:

df.apply(lambda x: (x==5).any() & (x == 6).any() & (x == 10).any(), axis=1)

我该如何修改代码以查找数据框中不存在的集合?例如,[5, 6, 10]。我尝试了 df[df.isin([5, 6,10])].dropna(thresh=3) 并得到了第6行。 - msampaio
你的意思是值不在5、6、10之间吗? - EdChum
我想找到只有包含三个值(5、6和10)的行。 - msampaio
我认为你可以使用 df.apply(lambda x: (x==5).any() & (x == 6).any() & (x == 10).any(), axis=1) - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接