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