熊猫数据框中的值的映射范围

E.夏季:

抱歉,是否曾经有人问过这个问题,但我进行了广泛调查,但没有结果。

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})
jpp:

有几种选择。

熊猫通过pd.cut/ NumPy通过np.digitize

您可以构造边界列表,然后使用专家库功能。这是在描述@ EdChum的解决方案中,也这个答案

NumPy通过 np.select

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)

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

通过字典映射 range

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章