我有以下问题:
我想根据adict中的两列映射adict的。不过,到目前为止,我唯一想到的解决方案是使用pandas dataframe。问题是我的dataframe有上百万行,所以使用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

最佳答案

您可以从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

09-10 03:02
查看更多