Python 3.x 使用除“应用”以外的许多条件添加新列的另一种方法

Python 3.x 使用除“应用”以外的许多条件添加新列的另一种方法,python-3.x,pandas,vectorization,Python 3.x,Pandas,Vectorization,我有两个数据帧,比如说df和map\u dum。这是df >>> print(df) sales 0 5 1 10 2 9 3 7 4 1 5 1 6 -1 7 2 8 9 9 8 10 1 11 3 12 10 13 -2 14 8 15 5 16 9 17 6 18 1

我有两个数据帧,比如说
df
map\u dum
。这是
df

>>> print(df)
    sales
0       5
1      10
2       9
3       7
4       1
5       1
6      -1
7       2
8       9
9       8
10      1
11      3
12     10
13     -2
14      8
15      5
16      9
17      6
18     10
19     -1
20      5
21      3
这是为
map\u dum
准备的

>>> print(map_dum)
   class  more_than_or_equal_to  less_than
0     -1                  -1000          0
1      1                      0          2
2      2                      2          4
3      3                      4          6
4      4                      6          8
5      5                      8         10
6      6                     10       1000
我的目标是向
df
,column
类添加新列。为此,我必须检查
df['sales']
中的值是否介于
map\u dum
中的值之间。例如,如果我想知道
df['sales']
,5中第一行的
类,那么
类将是3。最终输出如下所示

>>> print(df)
    sales  class
0       5      3
1      10      6
2       9      5
3       7      4
4       1      1
5       1      1
6      -1     -1
7       2      2
8       9      5
9       8      5
10      1      1
11      3      2
12     10      6
13     -2     -1
14      8      5
15      5      3
16      9      5
17      6      4
18     10      6
19     -1     -1
20      5      3
21      3      2
目前,我正在使用
apply
来解决这个问题,但是,由于我的数据集非常庞大,所以速度非常慢

def add_class(sales, mapping, lower_limit, upper_limit):
    result = mapping.loc[((mapping[lower_limit]<=sales)&(mapping[upper_limit]>sales)), 'class'].tolist()[0]
    return result

df['class'] = df['sales'].apply(lambda sales: add_class(sales, map_dum, 'more_than_or_equal_to', 'less_than'))
def添加类(销售、映射、下限、上限):
结果=mapping.loc[((mapping[lower_limit]sales)),“class'].tolist()[0]
返回结果
df['class']=df['sales'].应用(lambda sales:add_class(sales,map_dum,'more_than_或'u equal_to','less_than'))
因此,在我的情况下,性能确实很重要。有没有其他方法可以在不违反标准的情况下将
class
列添加到
df
,比如向量化解决方案?谢谢你的帮助

我认为您需要:

对于
map\u dum
中的动态添加值,请使用:

bins = [map_dum['more_than_or_equal_to'].iat[0]] + map_dum['less_than'].tolist()
labels= map_dum['class']
df['class'] = pd.cut(df['sales'], bins=bins, labels=labels, right=False)
print (df)

谢谢!它确实更快,更干净!
bins = [map_dum['more_than_or_equal_to'].iat[0]] + map_dum['less_than'].tolist()
labels= map_dum['class']
df['class'] = pd.cut(df['sales'], bins=bins, labels=labels, right=False)
print (df)