我有一个这样的数据框架:
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,但不能将其应用于整个数据集。
谁能在这里帮助或建议…
使用crosstab
和normalize=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)