在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个以上的物种,因此这是一个大量的输入,效率不高。我想一定有更干净的方法吗?在
您可以使用
filter
按模式选择列,并使用eq
检查sps1
列是否等于所有其他列,这里指定axis = rows
以按列进行比较。这将生成一个逻辑向量,可用于子集:Psidom已经用一个great answer覆盖了你,但是稍微借用一下它,你不能包括你要比较的列,然后使用^{} 来避免必须对每一行求和。在
你猜对了:
结果:
^{pr2}$相关问题 更多 >
编程相关推荐