如何 classify/label pandas dataframe 在最小值和最大值之间

How to classify/label pandas dataframe between minimum and maximum

我想要一个功能,例如get_cluster(df, numspan),即,给定一个 pandas DataFrame df 和一个整数 numspan 作为输入,return 是一个标签(数字)的 DataFrame df_cluster,表示根据 DataFrame 的最大值和最小值之差除以 numspan 计算的子集中的成员资格。

换句话说:

  1. 取 df,例如1, 2, 3, 4, 5(不一定是有序的,可能是实数)
  2. 获取最大值 5 和最小值 1
  3. 计算差值5 - 1 = 4,代表主集宽度
  4. 将差值除以 numspan,例如2获取子集单元宽度2
  5. 然后对于 DataFrame 的每个项目检查它属于哪个子集(规则是 L1 <= x < L2 其中 L1L2 是子集的下限和上限)
  6. return一个代表相关子集的数字,所以最后的df_cluster是1, 1, 2, 2, 2(规则包含最大上限对应的最后一个标签)

我的代码(再举个例子,也见下图):

import pandas as pd
df = pd.DataFrame({'A':pd.Series([4, 8, 2, 3])})

def get_cluster(df, numspan):
     min = df.min() # e.g. 2
     max = df.max() # e.g. 8
     span = max - min # e.g. 6
     subset_unit = span/numspan # e.g. 6/3 = 2 -> every subset is 2 width

     # code I need...

     return df_cluster

df['Cluster'] = get_cluster(df, 3)
df
   A  Cluster
0  4        2
1  8        3 <= included by rule
2  2        1
3  3        1

图中:

非常感谢您的帮助和时间,

吉尔伯托

更新

感谢@Boud,快速而优雅的解决方案是:

numbins = 3
labelnames = list(range(1, numbins +1))
df['Cluster'] = pd.cut(df['A'], bins = numbins, labels = labelnames, right=False, include_lowest=True)

这称为 pd.cut,其中 bins= 参数将允许您在问题中设置 numspan 的数字。

默认为returns bin 范围。 labels=False 是一个可用于获取 bin 编号的参数。