【发布时间】:2018-10-10 09:38:55
【问题描述】:
抱歉,如果以前有人问过这个问题,但我看了很多,没有结果。
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})
【问题讨论】:
-
将该映射转换为一对一映射应该不难。您目前如何存储这些地图数据?
-
到目前为止,我像上面一样插入了字典'by hand',因为映射相对简单。但我也可以事先定义字典。我意识到可以很容易地做到这一点,但是如果我想将值 [50..150] 映射到某个值呢?
-
那不是一本有效的字典。如果您有类似键值对的元组 [([1, 2, 3], 1), (range(4, 7), 2), ([8, 9, 10], 3)] ,您可以遍历列表并生成一对一的映射,但您需要先确定您的数据结构。
-
如果这是特定于范围,而不是任意数字集合,您可能需要查看
pd.cut。
标签: python pandas dataframe categories binning