首页 > 解决方案 > Pandas 优化了值的查找

问题描述

我有两个数据帧 simresult 和 skipper。

Simresult 的格式为:

     player_id      0      1      2      3  ...      5      6      7      8      9
0        41843  16.38  10.97   0.37  15.38  ...  23.78  38.08  47.21  26.14  11.94
1        17648  30.14  41.08   1.92   0.18  ...   0.00  39.01  41.08   8.54  22.95
2        16500  19.72  14.38  12.99   3.74  ...  17.72  32.70   3.34   0.50  28.66
3        36727   8.96  30.07  28.45   0.00  ...   0.00  20.48   0.00  27.64   2.15
4        10512  46.59  16.94   1.54   0.00  ...   5.89   0.00  18.33  11.24   0.71
..         ...    ...    ...    ...    ...  ...    ...    ...    ...    ...    ...

船长是:

          0      1        2        3  ...        6       7        8        9
0    449732  15862  1200230    10261  ...   814904   14622    16129  2500366
1     14759  10325    17769    16163  ...    10934   15862    17851    21540
2     14542  10934  2038972  2038976  ...  2039175   15181    35356    14622
3     11446  35356    10261    17851  ...   538921   16282    14542    34672
4     15806  21540   894408    37481  ...    15862  480013    15860   814065
..      ...    ...      ...      ...  ...      ...     ...      ...      ...

其中每个单元格都是一个 player_id。

我有一些代码从船长那里获取 player_ids 并按列从 simresult 中查找值,然后对行求和并给我一个列表列表。

即在船长中每行有 10 个 id,最终输出给我在第一列中查找的这 10 个 id 的总和,然后是第二列,依此类推。

此代码完全按预期工作。

size = skipper.shape[0]
runs = simresult.shape[1]-1

def getScores(r):

    slist = []
    
    for s in range(0,size): #size
        
        z = 0
        
        for l in range(0,10):

            y = skipper.iloc[s,l]
            x = simresult.loc[simresult['player_id'] == y, r].iloc[0]

            z += x

        z = round(z,2)
        
        slist.append(z)
    
    return(slist)


scores = np.empty((runs,0)).tolist()
    
for r in range(0,runs):
    
    scores[r] = getScores(r)  


在我获取列表列表并将其放入另一个 df 后的输出:

          0       1       2       3  ...       6       7       8       9
0     73.90  128.52  106.79  151.37  ...  126.81  115.88  139.87  115.43
1     93.51  135.78  130.62  130.72  ...  136.51  133.90  179.96  207.32
2    112.65  174.84  131.14  103.40  ...  159.58   85.81  116.59  158.88
3     83.37  129.34  117.12   64.50  ...  175.28   69.81  142.74  110.61
4     80.90  142.68   90.23  128.25  ...   51.04  141.63  134.30   95.76
..      ...     ...     ...     ...  ...     ...     ...     ...     ...

我的问题:有没有更有效的方法来编写这个查找嵌套循环?


简化的模拟结果: 简化的模拟结果

简化船长:

          0      1        2        3  ...        6       7        8        9
0    449732  15862  1200230    10261  ...   814904   14622    16129  2500366

简化输出:

          0       1       2       3  ...       6       7       8       9
0     73.90  128.52  106.79  151.37  ...  126.81  115.88  139.87  115.43

标签: python-3.xpandasoptimization

解决方案


使用魔法replace

rep_df = df.set_index('player_id')
out = skip.replace(rep_df)

推荐阅读