Pandas 使用除 apply 之外的许多条件添加新列的替代方法

2024-04-02

我有两个数据框,比方说df and map_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_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, 柱子class。为此,我必须检查中的值df['sales']位于其中的值之间map_dum。例如,如果我想知道class对于第一行df['sales'], 5, 那么class将为 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'))

因此,对于我来说,性能确实很重要。任何其他方式添加class列到df在不违反标准的情况下,像矢量化解决方案之类的东西?谢谢你的帮助!


我想你需要cut http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html:

bins = [-1000, 0, 2, 4, 6, 8, 10, 1000]
labels=[-1,1,2,3,4,5,6]
df['class'] = pd.cut(df['sales'], bins=bins, labels=labels, right=False)
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

对于动态添加值map_dum use:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 使用除 apply 之外的许多条件添加新列的替代方法 的相关文章

随机推荐