Результирующий фрейм данных из двух фреймов данных с разными именами столбцов и размерами строк, но с несколькими совпадающими значениями, представленными параллельно (Python) - PullRequest
1 голос
/ 22 октября 2019

Существует два кадра данных с идентификатором игроков и всеми очками, которые они набрали за два дня турнира (понедельник и пятница). Я хочу получить окончательный кадр данных в следующем формате.

    final =
       match_monday    points      match_friday     points   
    0  player#0005     13.0        player#0005      19.0
    1  player#0067     26.0        player#0067      0.0
    2  player#0098     0.0         player#0098      23.0  
    4  player#0104     24.0        player#0104      0.0
    5  player#0211     14.0        player#0211      0.0 
    6  player#0227     17.0        player#0227      21.0    

Отправной точкой являются эти два кадра данных:

    df1 =  
       match_monday     points           
    0  player#0227      17.0  
    1  player#0005      13.0  
    2  player#0104      24.0  
    3  player#0067      26.0  
    4  player#0211      14.0  

    df2 =  
       match_friday     points           
    0  player#0227      21.0  
    1  player#0098      23.0  
    2  player#0005      19.0  


    #Dataframes scripts:
    df1 = pd.DataFrame([['player#0227',17.0],['player#0005',13.0],['player#0104',24.0],['player#0067',26.0],['player#0211',14.0]],columns=['match_monday','points'])
    df2 = pd.DataFrame([['player#0227',21.0],['player#0098',23.0],['player#0005',19.0]],columns=['match_friday','points']) 

Я объединил два кадра данных и понял, чтоотсюда потребуется много шагов, чтобы добраться до нужного формата. Результат слияния:

        match_monday  points match_friday
    0  player#0227    17.0          NaN
    1  player#0005    13.0          NaN
    2  player#0104    24.0          NaN
    3  player#0067    26.0          NaN
    4  player#0211    14.0          NaN
    5          NaN    21.0  player#0227
    6          NaN    23.0  player#0098
    7          NaN    19.0  player#0005

Я пытался приказать match_friday, с этим предложением, вставить цикл for, когда я понял, что мой подход не был так хорош.

    matchMon = df2[df2.match_friday.isin(df1.match_monday)]

    print(machMon)
    match_friday  points
    0  player#0227    21.0
    2  player#0005    19.0

1 Ответ

1 голос
/ 22 октября 2019

Я думаю, лучше использовать другой подход - создать Series с помощью DataFrame.set_index с concat и в последний раз заменить пропущенные значения на fillna - затем получить индексы всехигроки:

a = df1.set_index('match_monday')['points'].rename('po_mon')
b = df2.set_index('match_friday')['points'].rename('po_fri')

df = pd.concat([a, b], axis=1, sort=False).fillna(0)
print (df)
             po_mon  po_fri
player#0227    17.0    21.0
player#0005    13.0    19.0
player#0104    24.0     0.0
player#0067    26.0     0.0
player#0211    14.0     0.0
player#0098     0.0    23.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...