链接2个数据帧并使用查找返回值

时间:2018-07-02 02:17:27

标签: python database pandas dataframe data-science

我通常是编码和数据的初学者,所以我能得到的任何帮助都会非常有帮助。

如果我有一个如下所示的数据框,那么每个匹配都是一个元组。

df1 = Team A Player 1.1        Team A Player 2.1              Team A Player 3.1
     ('Max', 'Hatteberg')   ('Hatteberg', 'Tejada')            ('Max', 'Rincon')
     ('Tejada', 'Brown')    ('Hatteberg', 'Rincon')         ('Hatteberg','Brown')

以此类推。

我有一个交叉表:

df2 =         Max  Hatteberg  Tejada     Brown     Rincon

  Max         NaN    -1.0      +2.0      -8.0       +5.0

  Hatteberg  +1.0     NaN      +2.5      +3.0         0

  Tejada     -2.0    -2.5       NaN      +5.5       -3.5

  Brown      +8.0    -3.0      -5.5       NaN       +2.8

  Rincon     -5.0      0       +3.5       2.8        NaN

我希望每次比赛都按原样返回一个值

df1 = matchups 1    matchups 2    matchups 3
        +1.0           -2.5         -5.0
        -5.5             0          -3.0

我尝试过

df1.applymap(lambda x : df2.lookup([x[0]],[x[1]])[0])

但它回来了

('One or more row labels was not found', 'occurred at index Team A Player 1.1')

我在同时引用两个数据帧和返回值时遇到问题。有人可以帮我吗?预先感谢

2 个答案:

答案 0 :(得分:0)

一种实用的解决方案是使用at和一个简单的for循环

df3 = pd.DataFrame()
for col in df1.columns:
    df3[col] = df1[col].apply(lambda x: df2.at[x[0], x[1]])

    col1    col2    col3
0   -1.0    2.5     5.0
1   5.5     0.0     3.0

答案 1 :(得分:0)

更像您在df1元组中有一些值,是指df2中的None值

您可以在reindex apply之前使用lookup

name=set(list(itertools.chain(*list(itertools.chain(*df1.values.tolist())))))
df2=df2.reindex(name).reindex(name,axis=1)
df1.applymap(lambda x : df2.lookup([x[0]],[x[1]])[0])