基于两列pandas映射dict字典的最有效方法

时间:2017-05-19 17:52:11

标签: python pandas numpy

我有以下问题: 我想基于dict中的2列来映射dict pandas dataframe apply。但是,到目前为止我提出的唯一解决方案是使用apply。问题是我的数据帧有超过一百万行,因此使用import pandas as pd import numpy as np dict_dict = {'A': {'a': 1, 'b': 2, 'c': 3}, 'B': {'a': 4, 'b': 5, 'c': 6}, 'C': {'a': 7, 'b': 8, 'c': 9}, 'D': {'a': 10, 'b': 11, 'c': 12}} list1 = ['A', 'B', 'C'] list2 = ['a', 'b', 'c'] np.random.seed(100) df = pd.DataFrame() df['col1'] = np.random.choice(list1, 10) df['col2'] = np.random.choice(list2, 10) df['map'] = df.apply(lambda x: dict_dict[x.col1][x.col2], axis=1) df col1 col2 map 0 A c 3 1 A c 3 2 A b 2 3 C a 7 4 C a 7 5 A a 1 6 C a 7 7 B c 6 8 C a 7 9 C b 8 可能会很长。关于如何更有效地做到这一点的任何想法?到目前为止,这是我的代码:

MinMaxScaler

1 个答案:

答案 0 :(得分:5)

您可以从dict_dict构建数据框并使用merge

# Construct a DataFrame from dict_dict
df2 = pd.DataFrame(dict_dict).stack().rename('map').to_frame()

# Perform a merge.
df = df.merge(df2, how='left', left_on=['col2', 'col1'], right_index=True)

结果输出:

  col1 col2  map
0    A    c    3
1    A    c    3
2    A    b    2
3    C    a    7
4    C    a    7
5    A    a    1
6    C    a    7
7    B    c    6
8    C    a    7
9    C    b    8