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

2024-06-08 00:31:56 发布

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

我希望我能正确地解释我的问题。。我有一个数据帧(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表示不存在细菌


Tags: 数据方法患者idfalsetruecountnan
2条回答

如果我理解正确,这只是一行一行地计算有多少var1 .. var2var3不同。没有涉及分组

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

cols = 'var1 var2 var3'.split()  # can be extended to more variables
df['count_diff'] = (df[cols[:-1]].values != df[cols[-1]].values[:, None]).sum(axis=1)

关于修改后的示例:

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,3, 0,0,1],[2,1, 0,0,1]],columns=['ID','Condition','var1','var2','var3'])
def comp(x):
    i=x.index[x['Condition']==3][0]
    #print(x!=x.loc[i])
    truth=(x[['var1','var2','var3']]==x.loc[i,['var1','var2','var3']])
    x=pd.concat([x[['ID','Condition']],truth],axis=1)
    return x
grp=df.groupby('ID').apply(comp)
grp['count_false']=grp[['var1','var2','var3']].apply(lambda x: 3-x.sum(),axis=1)
print(grp)

相关问题 更多 >

    热门问题