Python Проблема с присоединением или добавлением DataFrames - PullRequest
0 голосов
/ 25 апреля 2020

У меня проблема с фреймами данных в python. Я пытаюсь скопировать определенные строки в новый фрейм данных, но я не могу понять это. Не могли бы вы мне помочь?

Есть 2 массива:

pokemon_data

    #   HP  Attack  Defense Sp. Atk Sp. Def Speed
0   1   45  49  49  65  65  45
1   2   60  62  63  80  80  60
2   3   80  82  83  100 100 80
3   4   80  100 123 122 120 80
4   5   39  52  43  60  50  65
... ... ... ... ... ... ... ...
795 796 50  100 150 100 150 50
796 797 50  160 110 160 110 110
797 798 80  110 60  150 130 70
798 799 80  160 60  170 130 80
799 800 80  110 120 130 90  70

800 rows × 7 columns
combats_data


    First_pokemon   Second_pokemon  Winner
0   266 298 1
1   702 701 1
2   191 668 1
3   237 683 1
4   151 231 0
... ... ... ...
49995   707 126 0
49996   589 664 0
49997   303 368 1
49998   109 89  0
49999   9   73  0

50000 rows × 3 columns

Я создал третий набор данных со столбцами:

output1

    HP0 Attack0 Defens0 Sp. Atk0    Sp. Def0    Speed0  HP1 Attack1 Defense1    Sp. Atk1    Sp. Def1    Speed1  Winner

Что я пытаюсь сделать do копирует атрибуты из pokemon_data в output1 в порядке от combats_data .

HP0 и HP1 соответственно HP от первого покемона и HP от второго pokeomn.

Я хочу использовать эти данные в нейронных сетях с TensorFlow для прогнозирования того, что покемон выиграет.

Спасибо за ответы.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

Итак, я хотел бы создать новый массив на основе этих двух массивов. Например:

#ids represent pokemons and their attributes
pokemons = pd.DataFrame({'id': [1,2,3,4,5],
                    'HP': [10,20,30,40,50],
                    'Attack': [15,25,35,45,55],
                    'Defese' : [25,15,45,15,35]})

#here 0 or 1 represents whether first or second pokemon won
combats = pd.DataFrame({'id1': [1,2],
                    'id2': [3,4],
                    'winner': [0,1]})

#in output data i want to replace ids with attributes, the order is based on combats array
output = pd.DataFrame({'HP1': [10,20],
                    'Attack1': [15,25],
                    'Defense1': [25,15],
                      'HP2': [30,40],
                    'Attack2': [35,45],
                    'Defense2': [45,15],
                    'winner': [0,1]})

Не уверен, что его правильное мышление. Я хочу обучить нейронную сеть, чтобы выяснить, какой покемон победит.

0 голосов
/ 26 апреля 2020

Это решение от пользователя из форума 4programmers. net. импорт pandas как pd

if __name__ == "__main__":
    pokemon_data = pd.DataFrame({
        "Id": [1, 2, 3, 4, 5],
        "HP": [45, 60, 80, 80, 39],
        "Attack": [49, 62, 82, 100, 52],
        "Defense": [49, 63, 83, 123, 43],
        "Sp. Atk": [65, 80, 100, 122, 60],
        "Sp. Def": [65, 80, 100, 120, 50],
        "Speed": [45, 60, 80, 80, 65]})
    combats_data = pd.DataFrame({
        "First_pokemon": [1, 2, 3], 
        "Second_pokemon": [2, 3, 4], 
        "Winner": [1, 0, 1]})

    output = pokemon_data.merge(combats_data, left_on="Id", right_on="First_pokemon")
    output = output.merge(pokemon_data, left_on="Second_pokemon", right_on="Id",
                          suffixes=("_pokemon1", "_pokemon2"))

    print(output)
0 голосов
/ 25 апреля 2020

Для этого типа споров вы должны сначала «растопить» или «привести в порядок» combats_data, чтобы у каждого идентификатора была своя собственная строка, а затем выполнить «соединение» или «слияние» двух кадров данных.

Вы не предоставили минимальный воспроизводимый пример, так что вот мой:

import pandas as pd

df1 = pd.DataFrame({'id': [1,2,3,4,5],
                    'var1': [10,20,30,40,50],
                    'var2': [15,25,35,45,55]})
df2 = pd.DataFrame({'id1': [1,2],
                    'id2': [3,4],
                    'outcome': [1,4]})

df2tidy = pd.melt(df2, id_vars=['outcome'], value_vars=['id1', 'id2'],
                  var_name='name', value_name='id')

df2tidy
#   outcome name    id
# 0 1       id1     1
# 1 4       id1     2
# 2 1       id2     3
# 3 4       id2     4


output = pd.merge(df2tidy, df1, on='id')

output
#   outcome name    id  var1    var2
# 0 1       id1     1   10      15
# 1 4       id1     2   20      25
# 2 1       id2     3   30      35
# 3 4       id2     4   40      45

, который вы могли бы затем обучить некоторому классификатору на outcome.

(Кстати, вы должны сделать outcome 0 или 1 (для pokemon1 vs pokemon2) вместо фактического идентификатора победителя.)

...