gpt4 book ai didi

python - 范围 Pandas 之间字典中的查找值

转载 作者:行者123 更新时间:2023-11-28 16:20:32 24 4
gpt4 key购买 nike

我有一个格式如下的“查找”表:

Min | Max | Val
1 | 99 | "Principal"
100 | 199 | "Partner"
... | ... | ...

我的数据框中有一个 CURRENT_POINTS 系列介于 Min 或 Max(含)之间。

问题:如何创建一个基于上述查找表的VAL 列?我最初的想法是使用 df.lookup,但是 df 中有 800K 行,因此两个表的大小不相等。

预先感谢您的帮助!

有什么想法吗?

最佳答案

我会使用 cut()方法。

假设您有以下 DF:

In [187]: lkp
Out[187]:
Min Max Val
0 1 99 AAA
1 100 199 BBB
2 200 299 CCC
3 300 399 DDD

In [188]: df
Out[188]:
CURRENT_POINTS
0 55
1 10
2 20
3 144
4 194
5 143
6 397
7 233
8 128
9 215

使用cut() 方法我们可以生成一个category dtype 的新列,这可能会节省大量内存:

In [189]: df['Val'] = pd.cut(df.CURRENT_POINTS,
...: bins=[0] + lkp[['Min','Max']].stack()[1::2].tolist(),
...: labels=lkp.Val.tolist())
...:

In [190]: df
Out[190]:
CURRENT_POINTS Val
0 55 AAA
1 10 AAA
2 20 AAA
3 144 BBB
4 194 BBB
5 143 BBB
6 397 DDD
7 233 CCC
8 128 BBB
9 215 CCC

In [191]: df.dtypes
Out[191]:
CURRENT_POINTS int32
Val category
dtype: object

Category dtype 可以节省大量内存:

In [192]: big = pd.concat([df] * 10**5, ignore_index=True)

In [193]: big.shape
Out[193]: (1000000, 2)

In [194]: big['str_col'] = 'AAA'

In [198]: big.dtypes
Out[198]:
CURRENT_POINTS int32
Val category
str_col object
dtype: object

In [195]: big.memory_usage()
Out[195]:
Index 80
CURRENT_POINTS 4000000
Val 1000032 # <--- `category` column takes 1 byte per row (plus 32 bytes overhead)
str_col 8000000

In [197]: big.head()
Out[197]:
CURRENT_POINTS Val str_col
0 55 AAA AAA
1 10 AAA AAA
2 20 AAA AAA
3 144 BBB AAA
4 194 BBB AAA

注意:注意 categoryValstr_col 列的内存使用情况(dtype:object)

解释:

垃圾箱:

In [199]: lkp[['Min','Max']]
Out[199]:
Min Max
0 1 99
1 100 199
2 200 299
3 300 399

In [200]: lkp[['Min','Max']].stack()
Out[200]:
0 Min 1
Max 99
1 Min 100
Max 199
2 Min 200
Max 299
3 Min 300
Max 399
dtype: int64

In [201]: lkp[['Min','Max']].stack()[1::2].tolist()
Out[201]: [99, 199, 299, 399]

In [202]: [0] + lkp[['Min','Max']].stack()[1::2].tolist()
Out[202]: [0, 99, 199, 299, 399]

标签:

In [203]: lkp.Val.tolist()
Out[203]: ['AAA', 'BBB', 'CCC', 'DDD']

注意:lkp 在用于 binslabels 之前必须按 ['Min', 'Max'] 排序

这是一个排序的小演示:

In [2]: lkp
Out[2]:
Min Max Val
0 300 399 DDD
1 100 199 BBB
2 1 99 AAA
3 200 299 CCC

In [4]: lkp = lkp.sort_values(['Min','Max'])

In [5]: lkp
Out[5]:
Min Max Val
2 1 99 AAA
1 100 199 BBB
3 200 299 CCC
0 300 399 DDD

关于python - 范围 Pandas 之间字典中的查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com