如何在pandas中根据一列的指定值选择共享另一列值的行?
实际上,我有一个数据集,里面有5281行和大约40列的数据。从中我需要选出一些特定的值,这些值在另一行中是重复的。
为了简化,我尝试把数据整理成一个只有两列的表格,分别叫做A和B。
d = {'A': [2, 1, 2, 2, 1, 1, 3, 1, 1, 2], 'B':['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e']}
df = pd.DataFrame(d)
在图片中,你可以看到这个表格,我标记了我想要的部分:我想要一组A的值是(1, 2),并且它们在B列中有相同的值。
再给你一点背景信息:我需要删除那些在某一列(这里是B列)中有重复值的行,但只有当这些重复值在另一列(这里是A列)中有特定的值(比如1和2)时。我希望能直接在这个表格上进行这些操作。
2 个回答
0
当然可以!请看下面的内容:
这段代码的意思是,它会检查一个条件,如果这个条件成立,就会执行某些操作。简单来说,就是在某个情况下做某件事。
如果你想让程序在特定条件下运行,比如说用户输入了正确的密码,程序就会允许他们进入。这种检查就像是一个门卫,只有在你给出正确的密码时,门卫才会让你进来。
在代码中,通常会用一些符号来表示这些条件,比如“==”表示相等,“!=”表示不相等等等。这些符号就像是程序的语言,让它知道什么时候该做什么。
希望这个解释能帮助你理解这段代码的基本意思!如果还有其他问题,随时问我哦!
# if the values in A you're interested in
values_of_interest = {1, 2}
# Identify rows with duplicates in 'B' that correspond to the set of interest in 'A'
mask = df.duplicated('B', keep=False) & df['A'].isin(values_of_interest)
# To select these rows
selected_rows = df.loc[mask]
print(selected_rows)
2
试试这个方法:
在这个解决方案中,groupby()
会返回一个序列,其中 A 的值作为 集合
,B 的值作为索引。接着,我们检查每个集合是否等于目标集合。最后,我们将布尔值序列映射回原来的行数,这样就可以选择我们需要的行。
s = {1,2}
df.loc[df['B'].map(df.groupby('B')['A'].agg(set).eq(s))]
输出:
A B
0 2 a
1 1 a