【问题标题】:KeyError during Lookup for reference to crosstables查找期间的 KeyError 以参考交叉表
【发布时间】:2018-12-13 00:07:32
【问题描述】:

我有一个数据框:

dfAll = match ID    Team A Hero 1.1 Team A Hero 1.2   Team A Hero 1.3
     123124140         (1, 2)            (2, 3)            (1, 3)
     123123124         (4, 1)            (3, 4)            (1, 5)

等等……

我有一个交叉表:

dfEloCross =     1     2     3     4     5
             1  NaN  -1.0  +2.0  -8.0   +5.0

             2  +1.0  NaN  +2.5  +3.0    0

             3  -2.0 -2.5  NaN   +5.5   -3.5

             4  +8.0 -3.0  -5.5  NaN   +2.8

             5  -5.0   0   +3.5  -2.8    NaN

我希望每场比赛都像这样返回一个值,它是垂直与水平的。

df1 = matchups 1    matchups 2    matchups 3
       +1.0           -2.5         -2.0
       -8.0           -5.5         -5.0

我已尝试使用此代码:

for uv in range(1, 6):
for xv in range(1,6):
    dfAll['Matchup' + ' ' + str(uv) + '.' + str(xv)] = dfAll['Team A Hero' + ' ' + str(uv) + '.' + str(xv)].apply(lambda x: dfEloCross.lookup([x[0]],[x[1]])[0])

它适用于Team A Hero 1.1的第一列

但是 为其他人返回关键错误 KeyError: 'One or more column labels was not found

我是一个初学者,所以我很想得到我能得到的所有帮助。提前致谢!

编辑

作为参考,这是我的数据框的 sn-p:

dfAll = {'Team A Hero 1.1': {0: '(22, 21)', 1: '(12, 3)', 2: '(6, 7)', 3: '(13, 18)', 4: '(28, 7)', 5: '(9, 36)', 6: '(36, 7)', 7: '(9, 7)', 8: '(4, 61)'}, 'Team A Hero 1.2': {0: '(22, 43)', 1: '(12, 15)', 2: '(6, 31)', 3: '(13, 49)', 4: '(28, 13)', 5: '(9, 58)', 6: '(36, 13)', 7: '(9, 8)', 8: '(4, 64)'}, 'Team A Hero 1.3': {0: '(22, 71)', 1: '(12, 30)', 2: '(6, 40)', 3: '(13, 64)', 4: '(28, 56)', 5: '(9, 78)', 6: '(36, 30)', 7: '(9, 13)', 8: '(4, 72)'}, 'Team A Hero 1.4': {0: '(22, 77)', 1: '(12, 65)', 2: '(6, 43)', 3: '(13, 65)', 4: '(28, 87)', 5: '(9, 95)', 6: '(36, 80)', 7: '(9, 15)', 8: '(4, 76)'}, 'Team A Hero 1.5': {0: '(22, 85)', 1: '(12, 103)', 2: '(6, 69)', 3: '(13, 107)', 4: '(28, 106)', 5: '(9, 107)', 6: '(36, 98)', 7: '(9, 112)', 8: '(4, 84)'}, 'Team A Hero 2.1': {0: '(28, 21)', 1: '(58, 3)', 2: '(20, 7)', 3: '(54, 18)', 4: '(44, 7)', 5: '(28, 36)', 6: '(49, 7)', 7: '(52, 7)', 8: '(51, 61)'}}

【问题讨论】:

    标签: python python-3.x pandas dataframe lookup


    【解决方案1】:

    您不需要使用嵌套循环。相反,您可以使用 Pandas 可用的 pd.DataFrame.lookup 方法。

    在这种情况下,您可以迭代您的团队列,解压缩您的坐标并一次执行一个系列的查找:

    from ast import literal_eval
    
    df1 = pd.DataFrame({'matchID': [123124140, 123123124],
                        'TeamA_1.1': ['(1, 2)', '(4, 1)'],
                        'TeamA_1.2': ['(2, 3)', '(3, 4)']})
    
    # convert mapping table columns to integer type
    dfEloCross.columns = dfEloCross.columns.astype(int)
    
    # calculate columns which need mapping
    team_cols = df1.columns[df1.columns.str.startswith('Team')]
    
    # cycle each column, strip column & row coordinates and use with lookup
    for col in team_cols:
        c, r = zip(*df1[col].apply(literal_eval))
        df1[col] = dfEloCross.lookup(r, c)
    
    print(df1)
    
       TeamA_1.1  TeamA_1.2    matchID
    0        1.0       -2.5  123124140
    1       -8.0       -5.5  123123124
    

    【讨论】:

    • 感谢您的回答,不幸的是,它仍然返回此错误'One or more row labels was not found'
    • 这很有趣。不幸的是,我无法重现您的错误。如果您能够分享一些代码(就像我所做的那样)来演示问题,我可能会提供帮助。
    • 我很乐意,问题是它的代码很大,我如何正确分享它?
    • 有趣的是,它适用于我给您的数据框,但是当应用于我的更大数据框时,它再次返回相同的错误,我将尝试再次在我的帖子中复制该错误。我只想对所有的帮助表示感谢。我真的很感激。会不会是重复错误?该代码适用于第一列,但不适用于第二列
    • 感谢大家的帮助!!结果发现有一些缺失值导致元组 (1,") 并返回错误,已修复并且有效!!
    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2013-05-20
    • 2014-07-17
    相关资源
    最近更新 更多