Python 数据帧比较具有特定条件的多行

Python 数据帧比较具有特定条件的多行,python,pandas,dataframe,Python,Pandas,Dataframe,我希望我能正确地解释我的问题。。我有一个数据帧(306x40),其中有多行包含特定组的数据,我需要按索引对它们进行分组,这没有问题。接下来,我需要将这些行与具有特定条件的另一行进行比较。以这些数据为例: Id Condition var1 var2 var3 1 1 0 1 0 1 3 1 1 0 2 2 0 0 1 2 3

我希望我能正确地解释我的问题。。我有一个数据帧(306x40),其中有多行包含特定组的数据,我需要按索引对它们进行分组,这没有问题。接下来,我需要将这些行与具有特定条件的另一行进行比较。以这些数据为例:

Id  Condition   var1   var2   var3
1      1         0      1      0
1      3         1      1      0
2      2         0      0      1
2      3         0      0      1
2      1         0      0      1
所以我需要将每个Id的var1、var2、var3与具有条件3的行进行比较。。 结果会让我知道任何变量都不同于条件3中的变量。 可能的产出:

Id  Condition   var1   var2   var3  count_false
1      1        false  true   true      1
1      3        NaN    NaN    NaN       NaN
2      2        true   true   true      0
2      3        NaN    NaN    NaN       NaN
2      1        true   true   true      0
或者只是简单地说,对于y Id,条件x与条件3不同

我希望你们明白我需要什么,但我很乐意详细说明

提前非常感谢

编辑以使其更清晰:


数据包括3种不同方法检测患者体内细菌的数据(临床数据),请注意,每个患者使用哪种方法以及使用多少次不同。我有方法1,2,3,这些是不同的条件。变量是发现的不同种类的细菌。方法1和2是金标准,方法3是需要验证的方法。所以我想看看方法3是否给出了与方法1或2相同的结果。30+变量是细菌,值1表示存在细菌,值0表示不存在细菌。

如果我理解正确,这只是计算有多少
var1。。var2
与var3逐行不同。没有涉及分组

如果是这种情况(如果不是,很乐意修改),那么:

关于修改后的示例:

df = pd.DataFrame({
    'Id': [1, 1, 2, 2, 2],
    'Condition': [1, 3, 2, 3, 1],
    'var1': [0, 1, 0, 1, 0],
    'var2': [1, 1, 0, 1, 0],
    'var3': [0, 0, 1, 1, 1]})

cols = 'var1 var2 var3'.split()
df['count_diff'] = (df[cols[:-1]].values != df[cols[-1]].values[:, None]).sum(axis=1)
print(df)

# output:
   Id  Condition  var1  var2  var3  count_diff
0   1          1     0     1     0           1
1   1          3     1     1     0           2
2   2          2     0     0     1           2
3   2          3     1     1     1           0
4   2          1     0     0     1           2
#x=x、 loc[i]给出了与所需(条件)行进行比较时每行的真值。代码的其余部分如下所示:

df=pd.DataFrame([[1,1,0,1,0],[1,3,1,1,0],[2,2,0,0,1],[2,1,0,0,1],[2,1,0,0,1],[ID','Condition','var1','var2','var3'])
def组件(x):
i=x.index[x['条件]==3][0]
#打印(x!=x.loc[i])
真值=(x['var1','var2','var3']==x.loc[i,['var1','var2','var3']]
x=pd.concat([x[['ID','Condition']],真值],轴=1)
返回x
grp=df.groupby('ID')。应用(comp)
grp['count_false']=grp['var1','var2','var3'].应用(lambda x:3-x.sum(),axis=1)
印刷品(玻璃钢)

这篇文章我已经读了三遍了,但我还是不明白你想做什么。为什么某些行被替换为
NaN
?感谢您花时间。我编辑了我的帖子,希望它更清楚。我不知道为什么我把NaN放在那里,只是为了表明方法1和2的变量需要与方法3进行比较。那么你的意思是,每行
var3
可以只从该行的
var1
var2
计算,也就是说,不考虑其他行?那为什么是groupby呢?不完全是,很抱歉不清楚。因此,在1名患者中,有多种方法用于查找细菌,在示例df I中,该列被命名为条件值1(方法1)、2(方法2)或3方法(3)。通过这些不同的方法,我们发现了许多不同的细菌,在示例df中,我称这些列为var1、var2、var3。。。等值0不存在,1存在。我需要检查方法3是否产生了与方法1和方法2相同的结果,以及方法3和方法1或方法2的var1、var2、var3是否相同。在示例df中:第二行中的var1、2、3的值是否与第一行相同?对于患者2,第3行和第5行中的var1、var2、var3是否与第4行(使用的方法3)不同?这正是我需要的,非常感谢!唯一的问题是错误的计数,它给出了巨大的数字,我现在正试图修复它。
df = pd.DataFrame({
    'Id': [1, 1, 2, 2, 2],
    'Condition': [1, 3, 2, 3, 1],
    'var1': [0, 1, 0, 1, 0],
    'var2': [1, 1, 0, 1, 0],
    'var3': [0, 0, 1, 1, 1]})

cols = 'var1 var2 var3'.split()
df['count_diff'] = (df[cols[:-1]].values != df[cols[-1]].values[:, None]).sum(axis=1)
print(df)

# output:
   Id  Condition  var1  var2  var3  count_diff
0   1          1     0     1     0           1
1   1          3     1     1     0           2
2   2          2     0     0     1           2
3   2          3     1     1     1           0
4   2          1     0     0     1           2