【问题标题】:Pandas: Apply function to set of groups熊猫:将功能应用于一组组
【发布时间】:2016-11-15 20:35:00
【问题描述】:

我有以下问题:

给定一个二维数据框,第一列包含值,第二列给出点的类别,我想计算每个类别均值的 k-means 字典,并分配特定值的组均值最接近的质心作为原始数据框中的新列。

我想使用groupby 执行此操作。

更一般地说,我的问题是,apply(据我所知)只能使用在各个组上定义的函数(如 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 中的一个新列,它为每个条目提供字典中的值。

【问题讨论】:

  • 您能再描述一下您对 groupby 的尝试吗?对我来说这似乎很简单 - 但同样,我不确定你在说哪个问题。
  • @srey123 抱歉耽搁了。到目前为止,我试过: import pandas as pd 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') mean = groups.mean().unstack() 质心,字典= kmeans2(means,k) fig, ax = plt.subplots() 打印字典 我现在想得到的是 df 中的一个新列,它为每个条目提供字典中的值。不幸的是,我不知道如何将其排版为代码。
  • 你能在你的问题中自己添加这个吗?每行前留 4 个空格作为代码输入。在 cmets 中,不能发布代码。
  • @srey123 完成,谢谢!

标签: python pandas


【解决方案1】:

您可以通过以下方式实现:

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_meancluster 后追加 2 列,分别表示组的平均值和该组的平均值最接近的集群。

如果你真的想使用apply,你可以写一个函数从means_data_frame中读取集群值,并将其分配给df中的一个新列

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 2013-02-28
    • 1970-01-01
    • 2018-04-25
    • 2015-05-21
    • 2019-12-19
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多