根据其他两个列和表格在熊猫中创建列

时间:2018-08-15 20:07:39

标签: python pandas dictionary mapping

table = pd.DataFrame(data=[[1,2,3],[4,5,6],[7,8,9]],
                 columns=['High','Middle','Low'],
                index=['Blue','Green','Red'])

df = pd.DataFrame(data=[['High','Blue'],
                    ['High','Green'],
                    ['Low','Red'],
                   ['Middle','Blue'],
                    ['Low','Blue'],
                    ['Low','Red']],
             columns=['A','B'])

>>> df
        A      B
0    High   Blue
1    High  Green
2     Low    Red
3  Middle   Blue
4     Low   Blue
5     Low    Red

>>> table
       High  Middle  Low
Blue      1       2    3
Green     4       5    6
Red       7       8    9

我正在尝试添加第三列“ C”,该列基于表中的值。因此,第一行的值为1,第二行的值为4,等等。

如果这将是一维查找,我会将表转换为字典,并使用df['C'] = df['A'].map(table)。但是,由于这是二维的,所以我不知道如何使用地图或应用。

理想情况下,我会将表格转换为字典格式,因此我将其与其他字典一起保存在json中,但这不是必需的。

2 个答案:

答案 0 :(得分:5)

pandas lookup

table.lookup(df.B,df.A)
Out[248]: array([1, 4, 9, 2, 3, 9], dtype=int64)

#table['c']=table.lookup(df.B,df.A)

或者df.apply(lambda x : table.loc[x['B'],x['A']],1)个人不喜欢apply

答案 1 :(得分:3)

您可以为此使用merge

df2 = (df.merge(table.stack().reset_index(),
                left_on=['A','B'], right_on=['level_1', 'level_0'])
       .drop(['level_0', 'level_1'], 1)
       .rename(columns={0:'C'}))

>>> df2
        A      B  C
0    High   Blue  1
1    High  Green  4
2     Low    Red  9
3     Low    Red  9
4  Middle   Blue  2
5     Low   Blue  3