致所有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]