我有以下问题:
我想基于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
答案 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