Python:如何优化或简化以下代码?

Python:如何优化或简化以下代码?,python,python-3.x,optimization,logic,Python,Python 3.x,Optimization,Logic,我有一个df,如下所示: ContextID EscAct_Curr_A StepID 7289973 0.122100122 1 7289973 0 2 7289973 0 2 7289973 0.122100122 2 7289973 0.122100122 2 7289973 0.122100122 2 7289973 0.

我有一个
df
,如下所示:

ContextID   EscAct_Curr_A   StepID
7289973 0.122100122           1
7289973 0                     2
7289973 0                     2
7289973 0.122100122           2
7289973 0.122100122           2
7289973 0.122100122           2
7289973 0.122100122           2
7289999 0.244200245           1
7289999 0.244200245           1
7289999 0.244200245           1
7289999 0.244200245           2
7289999 0.366300374           2
7289999 0.366300374           2
7289999 0.366300374           2
7290025 0.122100122           1
7290025 0.122100122           1
7290025 0.122100122           2
7290025 0                     2
7290025 0                     2
7290025 0.122100122           2
我想做的是将来自不同stepid的所有值合并,并创建一个单独的df

例如,
StepID
1的所有值必须保存到一个df,比如s1,而
StepID
2的所有值必须保存到一个df,比如s2,依此类推。我有24个这样的继母。 完成后,我想在运行机器学习算法后绘制一个散点图

我所做的:

fig, ax = plt.subplots()
ax.scatter(s1.values[s1['y_ocsvm1'] == 1, 2], s1.values[s1['y_ocsvm1'] == 1, 1], c = 'green', label = 'Normal')
ax.scatter(s1.values[s1['y_ocsvm1'] == -1, 2], s1.values[s1['y_ocsvm1'] == -1, 1], c = 'red', label = 'Outlier')
ax.scatter(s2.values[s2['y_ocsvm2'] == 1, 2], s2.values[s2['y_ocsvm2'] == 1, 1], c = 'green')
ax.scatter(s2.values[s2['y_ocsvm2'] == -1, 2], s2.values[s2['y_ocsvm2'] == -1, 1], c = 'red')
plt.legend()
用于步骤ID 1

s1 = X.loc[X['StepID'] == 1]
s1_array = s1.iloc[:,1].values.astype(float).reshape(-1,1)
min_max_scaler = preprocessing.MinMaxScaler()
scaled_array_s1 = min_max_scaler.fit_transform(s1_array)
s1.iloc[:,1]=scaled_array_s1

ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')
s1['y_ocsvm1'] = ocsvm.fit_predict(s1.values[:,[1]])
用于步骤ID 2

s2 = X.loc[X['StepID'] == 2]
s2_array = s2.iloc[:,1].values.astype(float).reshape(-1,1)
min_max_scaler = preprocessing.MinMaxScaler()
scaled_array_s2 = min_max_scaler.fit_transform(s2_array)
s2.iloc[:,1]=scaled_array_s2

ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')
s2['y_ocsvm2'] = ocsvm.fit_predict(s2.values[:,[1]])
绘制散点图:

fig, ax = plt.subplots()
ax.scatter(s1.values[s1['y_ocsvm1'] == 1, 2], s1.values[s1['y_ocsvm1'] == 1, 1], c = 'green', label = 'Normal')
ax.scatter(s1.values[s1['y_ocsvm1'] == -1, 2], s1.values[s1['y_ocsvm1'] == -1, 1], c = 'red', label = 'Outlier')
ax.scatter(s2.values[s2['y_ocsvm2'] == 1, 2], s2.values[s2['y_ocsvm2'] == 1, 1], c = 'green')
ax.scatter(s2.values[s2['y_ocsvm2'] == -1, 2], s2.values[s2['y_ocsvm2'] == -1, 1], c = 'red')
plt.legend()

这些代码正是我想要的,但是为24个不同的stepid编写这样的代码是非常乏味的。因此,我想知道是否有一种更简洁的方法来实现以下目标,可能是通过使用循环或函数。

您有95%的重复代码。唯一真正不同的是特定的步骤ID。因此,您可以使用此函数并使用不同的ID多次调用它:

def waka(step_id, X=X)
    s = X.loc[X['StepID'] == step_id]
    s_array = s.iloc[:,1].values.astype(float).reshape(-1,1)
    min_max_scaler = preprocessing.MinMaxScaler()
    scaled_array_s = min_max_scaler.fit_transform(s_array)
    s.iloc[:,1] = scaled_array_s
    ocsvm = OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 'scale')

    return ocsvm.fit_predict(s.values[:,[1]])
    # OR!
    s['y_ocsvm'] = ocsvm.fit_predict(s.values[:,[1]])
    return s


您可以将结果存储在某种列表或dict中,以便以后绘制。

这样可以减少一些工作量。谢谢散点图代码有可能被简化成这样吗?您可以创建颜色和标签的列表,然后在枚举中为i,s(您的带有结果数据的列表)创建
散点