如何选择复杂条件下的行

时间:2017-01-27 14:04:44

标签: python pandas dataframe

我的数据框df如下所示:

A B  C
1 a A0
1 b A1
1 c B0 
2 d B1
2 e B2
2 f B3
3 g A2
3 h A3

首先,我想按df.A分组第一个(df_sub在下面)

df_sub1

A B C
1 a A0
1 b A1
1 c B0

df_sub2

A B C
2 d B1
2 e B2
2 f B3

df_sub3

A B C
3 g A2
3 h A3

其次,如果每个df_sub.C包含以"A"开头的字符串,则每个df_sub都会被完全连接。

在这种情况下,其中C列的字符串以df_sub1开头的df_sub3"A",以便df_sub1df_sub2连接在一起

所以我想得到下面的结果

A B C
1 a A0
1 b A1
1 c B0
3 g A2
3 h A3

在我看来,我必须将df分为A列,并在一些流程连接后。

我怎样才能得到这个结果?

2 个答案:

答案 0 :(得分:1)

我是对的,您想要排除'A'为2的行:

df[df['A'] != 2]

您还可以包含startswith的条件:

df[df['C'].str.startswith('A')]

这可能还不够,也许你的数据集有点偏颇(因为两种简单的方法都有效: - ))

您还可以迭代群组并删除不满足您条件的群组:

for idx, subdf in df.groupby(['A']):
    # print(subdf)  # this prints your groups

    # remove groups where not any (use all if you want all) C column starts with A
    if not subdf.C.str.startswith('A').any():
        df = df[df['A'] != idx]

print(df)

答案 1 :(得分:1)

您可以将concatstartswith创建的掩码过滤的其他DataFrame一起使用:

df1 = df[df.A == 1]
print (df1)
   A  B   C
0  1  a  A0
1  1  b  A1
2  1  c  B0

df2 = df[df.A != 1]
print (df2)
   A  B   C
3  2  d  B1
4  2  e  B2
5  2  f  B3
6  3  g  A2
7  3  h  A3

print (pd.concat([df1, df2[df2.C.str.startswith('A')]]))
   A  B   C
0  1  a  A0
1  1  b  A1
2  1  c  B0
6  3  g  A2
7  3  h  A3

更一般的解决方案是选择A的第一个值进行比较:

df1 = df[df.A == df.A.iat[0]]
print (df1)
   A  B   C
0  1  a  A0
1  1  b  A1
2  1  c  B0

df2 = df[df.A != df.A.iat[0]]
print (df2)
   A  B   C
3  2  d  B1
4  2  e  B2
5  2  f  B3
6  3  g  A2
7  3  h  A3

print (pd.concat([df1, df2[df2.C.str.startswith('A')]]))
   A  B   C
0  1  a  A0
1  1  b  A1
2  1  c  B0
6  3  g  A2
7  3  h  A3

如果需要列groupby的所有群组A,则可以使用filter条件,在C中找到至少一个以A开头的值:< / p>

print (df.groupby('A').filter(lambda x: x.C.str.startswith('A').any())) 
   A  B   C
0  1  a  A0
1  1  b  A1
2  1  c  B0
6  3  g  A2
7  3  h  A3