我在字典s19_df
中有一个df Bgf
,如下所示:
BacksGas_Flow_sccm ContextID StepID Time_Elapsed iso_forest
61.81640625 7289972 19 40.503 -1
62.59765625 7289972 19 41.503 -1
63.671875 7289972 19 42.503 1
65.625 7289972 19 43.503 1
61.81640625 7289973 19 40.448 -1
62.59765625 7289973 19 41.448 -1
63.671875 7289973 19 42.448 1
65.625 7289973 19 43.448 1
我编写了一个函数,通过在iso_forest
列上执行groupby
来计算ContextID
中+1和-1的数量,然后计算-1/1的比率:
def minus1_plus1_ratio(dictionary, new_df, step_df):
dictionary[new_df] = dictionary[step_df].groupby(['ContextID', 'iso_forest']).size().reset_index(name='count')
dictionary[new_df] = pd.pivot_table(dictionary[new_df], values = 'count', columns = ['iso_forest'],
index = ['ContextID']).fillna(value = 0)
dictionary[new_df]['-1/1'] = (dictionary[new_df][-1])/(dictionary[new_df][1])
dictionary[new_df] = dictionary[new_df].sort_values(by = '-1/1', ascending = False)
return dictionary[new_df]
因此,当我在上述df上运行该功能
minus1_plus1_ratio(Bgf, 's19_-1/1', 's19_df')
由于iso_forest
列同时包含-1和+1,因此效果很好
但是对于df如下:
BacksGas_Flow_sccm ContextID StepID Time_Elapsed iso_forest
61.81640625 7289972 19 40.503 1
62.59765625 7289972 19 41.503 1
63.671875 7289972 19 42.503 1
65.625 7289972 19 43.503 1
61.81640625 7289973 19 40.448 1
62.59765625 7289973 19 41.448 1
63.671875 7289973 19 42.448 1
65.625 7289973 19 43.448 1
在iso_forest
列中没有-1且仅存在+1的地方,由于没有-1,因此运行该函数将抛出key error: -1
。
所以,我想做的是,如果没有-1,那么在
之前dictionary[new_df]['-1/1'] = (dictionary[new_df][-1])/(dictionary[new_df][1])
步骤,必须创建一个名为-1
的列,并且必须用零填充。
同样,在某些情况下可能仅存在-1,而没有+1。在这种情况下,必须创建一列+1,并用零填充。
有人可以帮助我解决这里的逻辑问题吗?
答案 0 :(得分:2)
您可以使用unstack
和reindex
:
(df.groupby('ContextID').iso_forest
.value_counts()
.unstack(level=0, fill_value=0)
.reindex([-1,1],fill_value=0).T
)
输出:
iso_forest -1 1
ContextID
7289972 0 4
7289973 0 4