[英]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.. var2
與var3
不同。 不涉及分組。
如果是這種情況(如果不是,很高興修改),那么:
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.