我有下表,我试图选择在数据框中的某些点在“ C”列中显示为“ D”和“ E”的“ col1”和“ col2”对。
col1 col2 C val
aaa rte_1 D 58
aaa rte_2 E 47
bbb rte_3 D 2
aaa rte_4 E 35
aaa rte_5 E 95
ttt rte_6 E 84
aaa rte_1 D 57
ddd rte_2 C 36
aaa rte_3 C 13
aaa rte_4 C 28
aaa rte_5 E 3
换句话说,结果应该是
col1 col2 C val
aaa rte_1 D 58
aaa rte_5 E 95
aaa rte_1 D 57
aaa rte_5 E 3
我已经尝试过类似的方法,但是我得到了一个空的数据框,因此显然是错误的。
d = {'col1' : ['aaa', 'aaa', 'bbb', 'aaa', 'aaa', 'ttt', 'aaa', 'ddd', 'aaa', 'aaa', 'aaa'], 'col2' : ['rte_1', 'rte_2', 'rte_3', 'rte_4', 'rte_5', 'rte_6, 'rte_1', 'rte_2', 'rte_3', 'rte_4', 'rte_5'], 'C' : ['D', 'E', 'D', 'E', 'E', 'E', 'D', 'C', 'C', 'C', 'E'], 'val' : ['58', '47', '2', '35', '95', '84', '57', '36', '13', '28', '3']}
df = pd.DataFrame(d)
df2=df.loc[(df.C =='D')&(df.C =='E')]['A', 'B']
我怎样才能做到这一点?
编辑:当我说我想选择同时具有“ E”和“ D”的值时,我的意思是我想选择具有相同“ col1”和“ col2”对并具有“ D”的行,并且然后,在数据帧中的某个点,它们再次出现并带有“ E”(反之亦然,首先是“ E”,然后是“ D”)。我希望这可以澄清这个问题。
听起来您可能想尝试做的是查看组中的所有值是否仅为“ B”或“ E”。同时,您的预期输出还排除了满足该条件但只有一个成员的行。您可以GROUPBY你所提到的“配对”列和使用列表解析,检查是否所有的值要么D
或E
用all([True... )
。我还添加了另一条逻辑and len(x) > 1
,因为您的输出排除了只有一行的组。这将创建或的布尔系列s
(如果满足条件),可用于直接在数据帧上进行过滤,并获取“预期输出”。True
False
s = df.merge(df.groupby(['col1', 'col2'])['C'].apply(lambda x: all([True if y in ['D', 'E']
and len(x) > 1
else False for y in x ]))
.reset_index(),
how='left', on=['col1', 'col2']).iloc[:,-1]
df[s]
Out[1]:
col1 col2 C val
0 aaa rte_1 D 58
4 aaa rte_5 E 95
6 aaa rte_1 D 57
10 aaa rte_5 E 3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句