pandas 数据框中值的映射范围
Mapping ranges of values in pandas dataframe
如果之前有人问过这个问题,我深表歉意,但我广泛地查看了没有结果。
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 你可以使用 cut
来实现这个:
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]]
有几个选择。
Pandas 通过 pd.cut
/ NumPy 通过 np.digitize
您可以构造一个边界列表,然后使用专门的库函数。 , and also in .
中对此进行了描述
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
如果之前有人问过这个问题,我深表歉意,但我广泛地查看了没有结果。
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 你可以使用 cut
来实现这个:
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]]
有几个选择。
Pandas 通过 pd.cut
/ NumPy 通过 np.digitize
您可以构造一个边界列表,然后使用专门的库函数。
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