panda通过将一个列条目与多个其他列中的条目相匹配来选择行

2024-09-23 06:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

在python2.7中,我创建了一个pandas数据帧,格式如下:

import pandas as pd

df = pd.DataFrame({
'ID' : ['1','2','3'],
'sps1' : ['1001', '1111', '1000'],
'sps2' : ['1001','0001','NaN'],
'sps3' : ['1001','NaN','1000'],
'sps4' : ['1001','1101','0101']
})

因此,它看起来像:

^{pr2}$

每一行包含不同生物序列的数据,该序列具有唯一的ID(1、2、3等)。每个序列存在于4个不同的物种中(sps1-4)。每个序列中4个不同特征的存在(1)或不存在(0)被编码为4位代码。某些物种的序列缺失,因此记录了NaN。在

从这个数据框中,我想选择sps1的代码与其他物种的代码不匹配的行。在

所以在上面的示例中,我希望丢弃第0行(代码1001对所有SP都相同)和第2行(sps1代码1000与sps3的代码1000匹配),但保留第1行(sps1代码1111是唯一的)。在

最后,我希望将这些选定的行放入具有相同结构的新数据帧中。在

我不太习惯用熊猫。到目前为止,我设法找到了这样做的方法:

matches = df.loc[( (df['sps1'] != df['sps2']) & (df['sps1'] != df['sps3']) )].index
df_match = df.iloc[matches]

我可以在sps1和spxx的所有组合中继续这种风格,但在我的全面分析中,我将处理12个以上的物种,因此这是一个大量的输入,效率不高。我想一定有更干净的方法吗?在


Tags: 数据方法代码idpandasdf物种格式
3条回答

您可以使用filter按模式选择列,并使用eq检查sps1列是否等于所有其他列,这里指定axis = rows以按列进行比较。这将生成一个逻辑向量,可用于子集:

df[(df.filter(regex = "^sps").eq(df.sps1, axis="rows")).sum(axis=1) == 1]

#  ID   sps1    sps2    sps3    sps4
#1  2   1111    0001     NaN    1101

Psidom已经用一个great answer覆盖了你,但是稍微借用一下它,你不能包括你要比较的列,然后使用^{}来避免必须对每一行求和。在

df[~df.filter(regex="^sps(?!1$)\d+$").eq(df.sps1, axis='rows').any(1)]

你猜对了:

df.loc[[df.iloc[i,1:].duplicated().sum() == 0 for i in df.index]]

结果:

^{pr2}$

相关问题 更多 >