使用apply更新Pandas数据帧的Pythonic方法

时间:2017-09-13 15:54:55

标签: python pandas dataframe scikit-learn apply

致所有Python Panda大师。

下面是一段代码。我基本上想通过调用函数然后更新我的dataframe列来对现有数据帧应用更正。但是,apply()会返回一个新的数据帧。 所以我有点陷入困境,以pythonic的方式,我可以实现以下: -

正如您将在下面看到的,我不必要进行循环,然后将数据帧设置为正确的索引值。

理想情况下,我想对每个标签进行一次应用,这是for循环下面的注释部分,我循环索引。

代码是:

## run a cluster analysis on the yield levels
def run_cluster(data_df, num_clusters = 7):
    column = "Yield"
    kmeans = KMeans(n_clusters=num_clusters, random_state=0).fit(data_df[column].values.reshape(-1,1))
    # centroids, var = kmeans(data_df[column].values, num_clusters)
    centroids = kmeans.cluster_centers_
    data_df["Cluster"] = kmeans.labels_

    for label in np.unique(kmeans.labels_):
        idx = data_df[data_df["Cluster"] == label].index
        mad = np.median(np.abs(np.sum(centroids[label] - data_df[data_df["Cluster"] == label]["Yield"])))
        # data_flt = data_df[data_df["Cluster"] == label]
        for i in idx:
            data_df.ix[i,"Cluster"] = correct_clusters(data_df[data_df.index == i],centroids[label], mad)
        # new_data_df =    data_df[data_df["Cluster"] == label][["Yield","Cluster"]].\
        #                                 apply(lambda x: correct_clusters(x,centroids[label],mad))
        # new_data_df.to_csv("I:\\output\\new_df.csv")
    # for index, row in data_df.iterrows():


    # data_df["Cluster"] = assignment
    return centroids

def correct_clusters(row, centroid, mad):
    if np.abs((row.ix[:, "Yield"] - centroid).values) > mad:
        return -99  ## <- Special cluster which needs to be ignored!!
    else:
        return row.ix[:, "Cluster"].values[0]

0 个答案:

没有答案