大熊猫数据框的高效映射(按索引)

问题描述 投票:0回答:2

我目前正在优化我的代码,但发现了瓶颈。 我的数据框 df 的“数字”列的数字为 1 到 100(整数)。我想用字典映射这些数字。我知道我可以使用 .map() 或 .replace() 函数,但似乎这两种解决方案都很慢,并且没有考虑到“数字”中的数字是我的字典(系列)的索引,即:我想要执行以下操作:

dict_simple=[]
for i in range(100):
    dict_simple.append('a' +str(i))

df['Numbers_with_a']=df['Numbers'].apply(lambda x: dict_simple[x])

不幸的是应用功能也很慢。还有其他方法可以做得更快吗?数据帧有 50M+ 条记录。

我尝试过 pandas 包中的 .map()、replace() 和 .apply() 函数,但性能很差。我想缩短计算时间。

python pandas dictionary indexing processing-efficiency
2个回答
0
投票

pandas.Series
有一个索引,可用于将一个值映射到 pandas 中的另一个值,而无需为每一行调用
apply
或将值转换为 python
int
类型的额外费用。由于您要映射的数字默认从零开始,并且
Series
索引从
0
开始,因此您可以

import pandas as pd

df = pd.DataFrame({"numbers":[1,4,22,7,99]})
str_map = pd.Series([f'a{i}' for i in range(100)])
foo = str_map[df.numbers]
df['numbers_with_a'] = str_map.iloc[df.numbers].reset_index(drop=True)
print(df)

str_map
是从“a0”...字符串创建的
Series
str_map.iloc[df.numbers]
使用您的数字作为索引,为您提供新的
Series
映射值。该系列由您的数字索引,因此您可以删除该索引并将结果分配回原始数据帧。


0
投票

将列表转换为 numpy 数组并将它们映射如下:

dict_simple=[]
for i in range(100):
    dict_simple.append('a' +str(i))

dict_array = np.array(dict_simple)
df['Numbers_with_a'] = dict_array[df['Numbers'].values]
© www.soinside.com 2019 - 2024. All rights reserved.