如何 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 计算的子集中的成员资格。
换句话说:
- 取 df,例如
1, 2, 3, 4, 5
(不一定是有序的,可能是实数)
- 获取最大值
5
和最小值 1
- 计算差值
5 - 1 = 4
,代表主集宽度
- 将差值除以 numspan,例如
2
获取子集单元宽度2
- 然后对于 DataFrame 的每个项目检查它属于哪个子集(规则是 L1 <= x < L2 其中 L1和 L2 是子集的下限和上限)
- 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 编号的参数。
我想要一个功能,例如get_cluster(df, numspan)
,即,给定一个 pandas DataFrame df
和一个整数 numspan
作为输入,return 是一个标签(数字)的 DataFrame df_cluster
,表示根据 DataFrame 的最大值和最小值之差除以 numspan 计算的子集中的成员资格。
换句话说:
- 取 df,例如
1, 2, 3, 4, 5
(不一定是有序的,可能是实数) - 获取最大值
5
和最小值1
- 计算差值
5 - 1 = 4
,代表主集宽度 - 将差值除以 numspan,例如
2
获取子集单元宽度2
- 然后对于 DataFrame 的每个项目检查它属于哪个子集(规则是 L1 <= x < L2 其中 L1和 L2 是子集的下限和上限)
- 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 编号的参数。