我的数据框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_sub1
和df_sub2
连接在一起
所以我想得到下面的结果
A B C
1 a A0
1 b A1
1 c B0
3 g A2
3 h A3
在我看来,我必须将df
分为A列,并在一些流程连接后。
我怎样才能得到这个结果?
答案 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)
您可以将concat
与startswith
创建的掩码过滤的其他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