我遇到以下问题:
给定一个2D数据帧,第一列有值,第二列给出点的类别,我想计算每个类别均值的k-means字典,并指定特定值的组平均值最接近的质心作为原始数据框中的新列。
我想使用groupby
执行此操作。
更一般地说,我的问题是,应用(据我所知)只能使用在各个组上定义的函数(如mean())。 k-means需要所有组的信息。有没有比将所有内容转换为numpy数组并使用它们更好的方法?
import pandas as pd
import numpy as np
from scipy.cluster.vq import kmeans2
k=4
raw_data = np.random.randint(0,100,size=(100, 4))
f = pd.DataFrame(raw_data, columns=list('ABCD'))
df = pd.DataFrame(f, columns=['A','B'])
groups = df.groupby('A')
means = groups.mean().unstack()
centroids, dictionary = kmeans2(means,k)
fig, ax = plt.subplots()
print dictionary
我现在想要的是df中的一个新列,它为每个条目提供字典值。
答案 0 :(得分:0)
您可以通过以下方式实现:
import pandas as pd
import numpy as np
from scipy.cluster.vq import kmeans2
k = 4
raw_data = np.random.randint(0,100,size=(100, 4))
f = pd.DataFrame(raw_data, columns=list('ABCD'))
df = pd.DataFrame(f, columns=['A','B'])
groups = df.groupby('A')
means_data_frame = pd.DataFrame(groups.mean())
centroid, means_data_frame['cluster'] = kmeans2(means_data_frame['B'], k)
df.join(means_data_frame, rsuffix='_mean', on='A')
这将向df B_mean
和cluster
添加另外2列,分别表示群组的平均值和群组最接近的群集。
如果您真的想使用apply
,可以编写一个函数来从means_data_frame
读取群集值并将其分配到df