Python 数据帧中值的映射范围

Python 数据帧中值的映射范围,python,pandas,dataframe,categories,binning,Python,Pandas,Dataframe,Categories,Binning,如果以前有人问过我,我很抱歉,但是我看了很多遍,没有结果 import pandas as pd import numpy as np df = pd.DataFrame(data = np.random.randint(1,10,10),columns=['a']) a 0 7 1 8 2 8 3 3 4 1 5 1 6 2 7 8 8 6 9 6 我想创建一个新列b,根据一些规则映射a的几个值,比如a=[1,2,3]是1,a=[4,5,6

如果以前有人问过我,我很抱歉,但是我看了很多遍,没有结果

import pandas as pd    
import numpy as np    
df = pd.DataFrame(data = np.random.randint(1,10,10),columns=['a'])    

   a
0  7
1  8
2  8
3  3
4  1
5  1
6  2
7  8
8  6
9  6
我想创建一个新列
b
,根据一些规则映射
a
的几个值,比如a=[1,2,3]是1,a=[4,5,6,7]是2,a=[8,9,10]是3。一对一的映射对我来说很清楚,但是如果我想通过值列表或范围进行映射,该怎么办

我沿着这些路线思考

df['b'] = df['a'].map({[1,2,3]:1,range(4,7):2,[8,9,10]:3})
IIUC可用于实现以下目标:

In[33]:
pd.cut(df['a'], bins=[0,3,7,11], right=True, labels=False)+1

Out[33]: 
0    2
1    3
2    3
3    1
4    1
5    1
6    1
7    3
8    2
9    2
在这里,您将截止值传递给
cut
,这将对您的值进行分类,通过传递
labels=False
,它将给它们一个序数值(从零开始),因此您只需将
+1
传递给它们

在这里,您可以看到切割是如何计算的:

In[34]:
pd.cut(df['a'], bins=[0,3,7,11], right=True)

Out[34]: 
0     (3, 7]
1    (7, 11]
2    (7, 11]
3     (0, 3]
4     (0, 3]
5     (0, 3]
6     (0, 3]
7    (7, 11]
8     (3, 7]
9     (3, 7]
Name: a, dtype: category
Categories (3, interval[int64]): [(0, 3] < (3, 7] < (7, 11]]
[34]中的

pd.cut(df['a',bin=[0,3,7,11],right=True)
出[34]:
0     (3, 7]
1    (7, 11]
2    (7, 11]
3     (0, 3]
4     (0, 3]
5     (0, 3]
6     (0, 3]
7    (7, 11]
8     (3, 7]
9     (3, 7]
名称:a,数据类型:类别
类别(3,区间[int64]):[(0,3]<(3,7]<(7,11]]

有几种选择

熊猫通过
pd.cut
/NumPy通过
np.数字化
您可以构造边界列表,然后使用专家库函数。中介绍了这一点,以及中也介绍了这一点

通过
np进行NumPy。选择

criteria
的元素是布尔级数,因此对于值列表,可以使用
df['a'].isin([1,3])

通过
范围映射字典

将该映射转换为一对一映射应该不难。当前如何存储该映射数据?到目前为止,我如上所述“手动”插入字典,因为映射相对简单。但我也可以事先定义字典。我意识到可以轻松地进行一对一映射,但如果我想映射值[50..150]到某个值?但这不是一个有效的字典。如果你有一个类似于,比如,键值对的元组[([1,2,3],1),(范围(4,7,2),([8,9,10,3]),您可以迭代列表并生成一对一的映射,但需要首先确定数据结构。如果这是特定于范围的,而不是任意的数字集合,您可能需要查看。浮点值如何?我尝试使用字典映射,但它不适用于数据帧中的浮点值,它只对I进行分类恩特格尔ones@AHR,使用
np。如果选择
,则字典方法将不起作用。
df = pd.DataFrame(data=np.random.randint(1,10,10), columns=['a'])

criteria = [df['a'].between(1, 3), df['a'].between(4, 7), df['a'].between(8, 10)]
values = [1, 2, 3]

df['b'] = np.select(criteria, values, 0)
d = {range(1, 4): 1, range(4, 8): 2, range(8, 11): 3}

df['c'] = df['a'].apply(lambda x: next((v for k, v in d.items() if x in k), 0))

print(df)

   a  b  c
0  1  1  1
1  7  2  2
2  5  2  2
3  1  1  1
4  3  1  1
5  5  2  2
6  4  2  2
7  4  2  2
8  9  3  3
9  3  1  1