簡體   English   中英

Pandas dataframe 比較多行與特定條件

[英]Pandas dataframe compare multiple rows with specific condition

我希望我能正確解釋我的問題.. 我有一個 dataframe (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

或者只是簡單地說條件 x 與 y Id 的條件 3 不同

我希望你們明白我的需要,但我很樂意詳細說明

非常感謝您!

編輯以使其更清楚:

數據由來自 3 種不同方法的數據組成,用於檢測患者體內的細菌(臨床數據),請注意,每個患者使用的方法和次數都不同。 所以我有方法1、2、3,這些是不同的條件。 變量是發現的不同種類的細菌。 方法 1 和 2 是黃金標准,方法 3 是需要驗證的方法。 所以我想看看方法3是否與方法1或2給出相同的結果。30多個變量是細菌,值1表示存在細菌,0表示不存在。

如果我理解正確,這只是逐行計算有多少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] 在與所需(條件)行進行比較時為您提供每一行的真值:代碼的 Rest 如下:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM