如何在垂直条件下提取行

时间:2017-01-26 09:53:31

标签: python pandas dataframe

现在我有数据框

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

2 个答案:

答案 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)