检查多行pandas中标志列的有效性

时间:2017-04-17 10:13:55

标签: python pandas dataframe

我有一个数据框:

a      id   flag1    flag2
abc    1     1          0
123    1     0          1
xyz    2     1          0
111    2     0          1
qwe    3     1          0
qwe    3     1          0
mmm    4     1          0
222    4     0          1

我想找到{1}}号,其中flag1和flag2都是id

例如。  对于id 1,在第一行中,flag1 = 1且flag2 = 0,第二行,flag1 = 0和flag2 = 1.

我的最终输出应该是这样的

1

或只有id列也可以在列表中使用a id flag1 flag2 abc 1 1 0 123 1 0 1 xyz 2 1 0 111 2 0 1 mmm 4 1 0 222 4 0 1

因为对于id = 3,在id = 3且标志2为0的行中flag1为1,所以我不得不忽略它。

我试图写一个功能,但失败了。

[1,2,4]

2 个答案:

答案 0 :(得分:3)

尝试这种方法:

In [23]: ids = df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any()).all(1)

In [24]: ids
Out[24]:
id
1     True
2     True
3    False
4     True
dtype: bool

In [25]: ids.index[ids]
Out[25]: Int64Index([1, 2, 4], dtype='int64', name='id')

说明:

In [26]: df.groupby('id')['flag1','flag2'].apply(lambda x: x.eq(1).any())
Out[26]:
   flag1  flag2
id
1   True   True
2   True   True
3   True  False
4   True   True

x.eq(1).any()(x == 1).any()相同 - 即如果True系列中至少有一个值等于x,则返回1,否则返回False }}

<强>更新

In [34]: ids.index[ids].values
Out[34]: array([1, 2, 4], dtype=int64)

In [35]: ids.index[ids].values.tolist()
Out[35]: [1, 2, 4]

答案 1 :(得分:1)

我相信有更好的方法可以实现这一目标,但您可以尝试:

df['count_max1'] = df.groupby(['id'])['flag1'].transform(max)
df['count_max2'] = df.groupby(['id'])['flag2'].transform(max)
# Select rows 
df[(df['count_max1'] ==1 & (df['count_max2'] == 1)]

变换矩阵的作用是:

a      id   flag1    flag2    count_max1   count_max2
abc    1     1          0         1            1
123    1     0          1         1            1
xyz    2     1          0         1            1
111    2     0          1         1            1
qwe    3     1          0         1            0
qwe    3     1          0         1            0
mmm    4     1          0         1            1
222    4     0          1         1            1

选择行时,最终输出为:

a    id    flag1   flag2    count_max1  count_max2
abc    1     1          0       1            1
123    1     0          1       1            1
xyz    2     1          0       1            1
111    2     0          1       1            1
mmm    4     1          0       1            1
222    4     0          1       1            1 

您可以稍后删除行count_max1和count_max2