现在我有数据框
A B C
1 a 1
1 b 0
1 c 0
1 d 1
2 e 1
2 f 1
2 g 0
3 h 1
3 i 0
3 j 1
3 k 1
我想用df.C
提取条件在每个df.A中,例如数字1
df.query(" A == 1")=
A B C
1 a 1
1 b 0
1 c 1
1 d 1
在df.C中,数字1夹在一个或多个零之间。
df.query(" A == 1&#34)。C =
1
0
1
1
所以提取这个框架。
但是框架df.query(" A == 2")与上述情况不符。
总之,我想在下面的数据框
A B C
1 a 1
1 b 0
1 c 0
1 d 1
3 h 1
3 i 0
3 j 1
3 k 1
答案 0 :(得分:4)
您可以使用filtration - 检查每个C
group
中的0
中的第一个和最后一个值是不是print (df)
A B C
0 1 a 1
1 1 b 0
2 1 c 0
3 1 d 1
4 2 e 1
5 2 f 1
6 2 g 0
7 3 h 1
8 3 i 1
9 3 j 0
10 3 k 1
11 4 j 0
12 4 k 0
13 4 k 1
df = df.groupby('A').filter(lambda x: not (x.C.iat[0] == 0 or x.C.iat[-1] == 0))
print (df)
A B C
0 1 a 1
1 1 b 0
2 1 c 0
3 1 d 1
7 3 h 1
8 3 i 1
9 3 j 0
10 3 k 1
:
0
但如果在某些群组中可能不df = df.groupby('A')
.filter(lambda x: not (x.C.iat[0] == 0 or x.C.iat[-1] == 0) and (x.C == 0).any())
,你也必须检查它:
{{1}}
答案 1 :(得分:1)
你已经接受了第一个答案,但我仍然会发布这个冗长而混乱的答案。
您可以使用不同的groupbys来获取布尔索引所需的数字。
dg = df.groupby('A')
Cf = dg.C.first()
Cl = dg.C.last()
Cs = dg.C.sum()
Cc = dg.C.count()
dd = pd.DataFrame([Cf,Cl,Cs,Cc]).T.reset_index()
dd.columns = ['A','CFirst','CLast','CSum','CCount']
de = pd.merge(df,dd,on='A',how='left')
res = de[(de.CCount > de.CSum)&(de.CFirst+de.CLast == 2)]
res = res.drop(["CFirst","CLast","CSum","CCount"],axis=1)