我有一个数据框:
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]
答案 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