Python 在数据框(df)中添加一个新列,该列存储每个个体的(总存在)/(总存在+总不存在)值

Python 在数据框(df)中添加一个新列,该列存储每个个体的(总存在)/(总存在+总不存在)值,python,pandas,numpy,Python,Pandas,Numpy,这是一个名为df的数据帧。我如何向其中添加新列来存储每个单独数据的total present/total present+total缺席考虑数据帧df 您可以将pd.value\u计数与normalize=True一起使用 一个虚拟数据帧,为了简单起见,我创建了A、b、c、d作为列名 import pandas as pd df = pd.DataFrame({'a': ['jon','sam','dean','bob'], 'b': ['present','pre

这是一个名为df的数据帧。我如何向其中添加新列来存储每个单独数据的total present/total present+total缺席

考虑数据帧df

您可以将pd.value\u计数与normalize=True一起使用


一个虚拟数据帧,为了简单起见,我创建了A、b、c、d作为列名

import pandas as pd
df = pd.DataFrame({'a': ['jon','sam','dean','bob'],
               'b': ['present','present','absent','present'],
               'c':['absent','present','present','absent'],
               'd':['absent','absent','present','present']})

df['b1'] = df['b'].map({'present': 1, 'absent': 0})
df['c1'] = df['c'].map({'present': 1, 'absent': 0})
df['d1'] = df['d'].map({'present': 1, 'absent': 0})

df['sum_1'] = (df[['b1','c1','d1']] == 1).sum(axis=1)
df['sum_0'] = (df[['b1','c1','d1']] == 0).sum(axis=1)

df['present'] =((df['sum_1']* 1.0)/(df['sum_1']+df['sum_0']))

df[['a','b','c','d','present']]
或者您可以简单地使用@piRSquared建议的解决方案

import pandas as pd
df = pd.DataFrame({'a': ['jon','sam','dean','bob'],
           'b': ['present','present','absent','present'],
           'c':['absent','present','present','absent'],
           'd':['absent','absent','present','present']})
df.assign(present=df.stack().map(dict(present=1, absent=0)).unstack().mean(1))

! 哇,你一句话就解决了!我必须为此写至少10个步骤!请检查我的答案,如果任何冗余可以消除。嗯,我检查两个解决方案的相同数据和不同的输出。看起来其中一个解决方案不好,你能检查一下吗?df.assignPresent=df.stack.mapdictPresent=1,缺席=0.unstack.mean1对这个数据产生相同的结果。使用你的df和方法df.assignPresent=df.stack.mapdictPresent=1,缺席=0.unstack.mean1Hmmm,我用相同的数据和不同的输出检查两个解决方案。看起来其中一个解决方案不好,你能检查一下吗?@jezrael好的,先生,但你可以在我的输出中清楚地看到,对于第一排,有2个不存在,1个存在,因此它将是1/1+2=0.33,同样对于第二排sam,有2个存在,1个不存在。所以从数学上来说,结果应该是2/2+1=0.666,我得到了相同的结果。超级,我认为你的解是正确的,也许更好的方法是使用-别担心,把它加到答案中。@jezrael是的,先生:
import pandas as pd
df = pd.DataFrame({'a': ['jon','sam','dean','bob'],
               'b': ['present','present','absent','present'],
               'c':['absent','present','present','absent'],
               'd':['absent','absent','present','present']})

df['b1'] = df['b'].map({'present': 1, 'absent': 0})
df['c1'] = df['c'].map({'present': 1, 'absent': 0})
df['d1'] = df['d'].map({'present': 1, 'absent': 0})

df['sum_1'] = (df[['b1','c1','d1']] == 1).sum(axis=1)
df['sum_0'] = (df[['b1','c1','d1']] == 0).sum(axis=1)

df['present'] =((df['sum_1']* 1.0)/(df['sum_1']+df['sum_0']))

df[['a','b','c','d','present']]
import pandas as pd
df = pd.DataFrame({'a': ['jon','sam','dean','bob'],
           'b': ['present','present','absent','present'],
           'c':['absent','present','present','absent'],
           'd':['absent','absent','present','present']})
df.assign(present=df.stack().map(dict(present=1, absent=0)).unstack().mean(1))