查找数据框列中的概率



我有一个这样的数据框架:

state   class
A      0
B      1
C      1
A      0
A      1
B      1
A      0
A      1
C      1
C      0

,我试图找到在状态中找到的每个唯一值的概率,每个输出类,这样的结果输出将是:

State_0   State_1    Class
3/5       2/5         0
0/2       2/2         1
1/3       2/3         1
3/5       2/5         0
3/5       2/5         1
0/2       2/2         1
3/5       2/5         0
3/5       2/5         1
1/3       2/3         1
1/3       2/3         0

逻辑用于查找这些值:
A、B、C是状态中的唯一值,其中A共出现5次,其中class为0时出现3次,class为1时出现2次。我能够找到单个状态的state_0和state_1值,如a,B或C,但不能将其应用于整个数据集。

谁能在这里帮助或建议…

使用crosstabnormalize=0,然后在DataFrame.add_prefix的列中添加前缀,在原始DataFrame中添加DataFrame.join:

df1 = df.join(pd.crosstab(df['state'], df['class'], normalize=0).add_prefix('State_'), 
on='state')
print (df1)
state  class   State_0   State_1
0     A      0  0.600000  0.400000
1     B      1  0.000000  1.000000
2     C      1  0.333333  0.666667
3     A      0  0.600000  0.400000
4     A      1  0.600000  0.400000
5     B      1  0.000000  1.000000
6     A      0  0.600000  0.400000
7     A      1  0.600000  0.400000
8     C      1  0.333333  0.666667
9     C      0  0.333333  0.666667

最后如果需要过滤一些列:

df2 = df1.reindex(['State_0','State_1','class'], axis=1)
print (df2)
State_0   State_1  class
0  0.600000  0.400000      0
1  0.000000  1.000000      1
2  0.333333  0.666667      1
3  0.600000  0.400000      0
4  0.600000  0.400000      1
5  0.000000  1.000000      1
6  0.600000  0.400000      0
7  0.600000  0.400000      1
8  0.333333  0.666667      1
9  0.333333  0.666667      0

暴力使用groupby

state=['A','B','C','A','A','B','A','A','C','C']     
myclass=[0,1,1,0,1,1,0,1,1,0]
df=pd.DataFrame({'state':state,'class':myclass})
groupedCount=df.groupby('state').count().values
groupedSum=df.groupby(['state']).sum().values
for key,row in df.iterrows():
a_class=row['class']
a_state=row['state']
stateCount=groupedCount[a_class][0]
zeroSum=groupedCount[a_class][0]-groupedSum[a_class][0]
oneSum=groupedSum[a_class][0]
if a_class==0:
df.loc[key,'State_'+str(a_class)]=str(zeroSum)+'/'+str(stateCount)
df.loc[key,'State_1']=str(stateCount-zeroSum)+'/'+str(stateCount)
else:
df.loc[key,'State_'+str(a_class)]=str(oneSum)+'/'+str(stateCount)
df.loc[key,'State_0']=str(stateCount-oneSum)+'/'+str(stateCount)
print(a_class,a_state,groupedSum[a_class][0],groupedCount[a_class][0])
print(df.head)

最新更新