Присоединяйтесь, где ключи не равны в Pandas - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть такой фрейм данных:

data = {'teamid': [1, 2, 3, 4], 'gameid': [1, 1, 2, 2], 'rebounds': [20, 35, 43, 15]}
game_df = pd.DataFrame(data=data)
print(game_df)

   teamid  gameid  rebounds
0       1       1        20
1       2       1        35
2       3       2        43
3       4       2        15

Я бы хотел присоединить его к себе сам, чтобы создать такой фрейм данных:

wanted_data = {'teamid': [1, 2, 3, 4], 'gameid': [1, 1, 2, 2], 'rebounds': [20, 35, 43, 15],
               'teamid_opponent': [2, 1, 4, 3], 'rebound_opponent': [35, 20, 15, 43]}
wanted_df = pd.DataFrame(data=wanted_data)
print(wanted_df)

   teamid  gameid  rebounds  teamid_opponent  rebound_opponent
0       1       1        20                2                35
1       2       1        35                1                20
2       3       2        43                4                15
3       4       2        15                3                43

В SQL я бы просто сделалчто-то вроде этого:

SELECT * from game_df df1 join game_df df2 on df1.gameid = df2.gameid and df1.teamid != df2.teamid

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

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Вот один из способов использования merge

Yourdf=game_df.merge(game_df,on='gameid',suffixes =['','_opponent']).query('teamid!=teamid_opponent')
Out[42]: 
   teamid  gameid  rebounds  teamid_opponent  rebounds_opponent
1       1       1        20                2                 35
2       2       1        35                1                 20
5       3       2        43                4                 15
6       4       2        15                3                 43
0 голосов
/ 26 сентября 2019

Я также добавлю, что ответ заставил меня задуматься о другом способе сделать это, поэтому я опубликую его для потомков

Yourdf=game_df.merge(game_df,on='gameid',suffixes =['','_opponent'])
Yourdf[Yourdf.teamid != Yourdf.teamid_opponent]

   teamid  gameid  rebounds  teamid_opponent  rebounds_opponent
1       1       1        20                2                 35
2       2       1        35                1                 20
5       3       2        43                4                 15
6       4       2        15                3                 43
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...