如何使用 pandas 将连续数字转换为分类数字?
How to convert the continuous numbers into categorical using pandas?
几天来我一直在寻找这个问题的解决方案,但不幸的是没有成功。
我在这样的列中有连续值:
Val: 1, 15, 2, 91, 52, 126
我需要将这些数字转换为区间类别。例如,第一个数字应属于类别 (1-10)
我知道我们可以定义区间并使用 pd.cut
转换数据
pd.cut(df.val, right=False)
但我的问题是我无法定义间隔,因为我有数百万的价值。
理想的解决方案是我可以定义间隔的范围,然后它会自动搜索值并将其转换为该类别。
这将是我的理想输出:
Val Val_Cat
1 1-10
15 10-20
2 1-10
91 90-100
52 50-60
126 120-130
一个想法是使用整数除以 //
除以 10
,然后乘以 10
,最后转换为字符串(必要时重新计算):
s = df['Val'] // 10 * 10
df['new'] = s.replace(0, 1).astype(str) + '-' + (s + 10).astype(str)
print (df)
Val Val_Cat new
0 1 1-10 1-10
1 15 10-20 10-20
2 2 1-10 1-10
3 91 90-100 90-100
4 52 50-60 50-60
5 126 120-130 120-130
替代 f-string
s:
df['new'] = df['Val'].map(lambda x: f'{x//10*10}-{(x//10*10)+10}')
print (df)
Val Val_Cat new
0 1 1-10 0-10
1 15 10-20 10-20
2 2 1-10 0-10
3 91 90-100 90-100
4 52 50-60 50-60
5 126 120-130 120-130
您的 cut 解决方案可能会更改为:
bins = np.arange(0, df['Val'].max() // 10 * 10 + 20, 10)
df['new'] = pd.cut(df.Val, bins = bins, right=False)
print (df)
Val Val_Cat new
0 1 1-10 [0, 10)
1 15 10-20 [10, 20)
2 2 1-10 [0, 10)
3 91 90-100 [90, 100)
4 52 50-60 [50, 60)
5 126 120-130 [120, 130)
您可以创建一个包含所需类别的新列:
def cat(x):
return str(x//10*10) + '-' + str((x//10*10)+10)
df['Val_cat']=list(map(cat, df.Val))
几天来我一直在寻找这个问题的解决方案,但不幸的是没有成功。
我在这样的列中有连续值:
Val: 1, 15, 2, 91, 52, 126
我需要将这些数字转换为区间类别。例如,第一个数字应属于类别 (1-10)
我知道我们可以定义区间并使用 pd.cut
pd.cut(df.val, right=False)
但我的问题是我无法定义间隔,因为我有数百万的价值。
理想的解决方案是我可以定义间隔的范围,然后它会自动搜索值并将其转换为该类别。
这将是我的理想输出:
Val Val_Cat
1 1-10
15 10-20
2 1-10
91 90-100
52 50-60
126 120-130
一个想法是使用整数除以 //
除以 10
,然后乘以 10
,最后转换为字符串(必要时重新计算):
s = df['Val'] // 10 * 10
df['new'] = s.replace(0, 1).astype(str) + '-' + (s + 10).astype(str)
print (df)
Val Val_Cat new
0 1 1-10 1-10
1 15 10-20 10-20
2 2 1-10 1-10
3 91 90-100 90-100
4 52 50-60 50-60
5 126 120-130 120-130
替代 f-string
s:
df['new'] = df['Val'].map(lambda x: f'{x//10*10}-{(x//10*10)+10}')
print (df)
Val Val_Cat new
0 1 1-10 0-10
1 15 10-20 10-20
2 2 1-10 0-10
3 91 90-100 90-100
4 52 50-60 50-60
5 126 120-130 120-130
您的 cut 解决方案可能会更改为:
bins = np.arange(0, df['Val'].max() // 10 * 10 + 20, 10)
df['new'] = pd.cut(df.Val, bins = bins, right=False)
print (df)
Val Val_Cat new
0 1 1-10 [0, 10)
1 15 10-20 [10, 20)
2 2 1-10 [0, 10)
3 91 90-100 [90, 100)
4 52 50-60 [50, 60)
5 126 120-130 [120, 130)
您可以创建一个包含所需类别的新列:
def cat(x):
return str(x//10*10) + '-' + str((x//10*10)+10)
df['Val_cat']=list(map(cat, df.Val))