#python #pandas #numpy #dataframe #merge
#python #pandas #numpy #фрейм данных #слияние
Вопрос:
У меня есть один фрейм данных, подобный этому,
tabla_aciertos= {'Numeros_acertados' : [5,5,5,4,4,3,4,2,3,3,1,2,2],'Estrellas_acertadas': [2,1,0,2,1,2,0,2,1,0,2,1,0]}
categorias = [1,2,3,4,5,6,7,8,9,10,11,12,13]
categoria_de_premios = pd.DataFrame (tabla_aciertos,index = [categorias] )
categoria_de_premios
Numeros_acertados Estrellas_acertadas
1 5 2
2 5 1
3 5 0
4 4 2
5 4 1
6 3 2
7 4 0
8 2 2
9 3 1
10 3 0
11 1 2
12 2 1
13 2 0
и еще один df :
sorteos_anteriores.iloc[:,:]
uno dos tres cuatro cinco Estrella1 Estrella2 bolas_Acertadas estrellas_Acertadas
Fecha
2020-10-13 5 14 38 41 46 1 10 0 1
2020-09-10 11 15 35 41 50 5 8 1 0
2020-06-10 4 21 36 41 47 9 11 0 0
2020-02-10 6 12 15 40 45 3 9 0 0
2020-09-29 4 14 16 41 44 11 12 0 1
... ... ... ... ... ... ... ... ... ...
2004-12-03 15 24 28 44 47 4 5 0 0
2004-05-03 4 7 33 37 39 1 5 0 1
2004-02-27 14 18 19 31 37 4 5 0 0
2004-02-20 7 13 39 47 50 2 5 1 0
2004-02-13 16 29 32 36 41 7 9 0 0
1363 rows × 9 columns
Теперь мне нужно видеть, что в каждой строке df «sorteos_anteriores» находится в одной из всех строк из первого df, «tabla_aciertos».
Позвольте мне привести вам один пример,
Inmagine в «sorteos_anteriores» у вас есть в: 2019-11-2 in the column "bolas_Acertadas"= 5 and "estrellas_Acertadas= 1"
. Теперь вы переходите к первой таблице «tabla_aciertos» и находите это в (index 2 = "Numeros_acertados" = 5 and Estrellas_acertadas=1)
. Вы выиграли второй (индекс = 2) приз класса. Вы должны создать новый столбец «Приз» в «sorteos_anteriores» и в каждой строке написать число from 1 to 13
, если у вас есть какой-то приз 0 or Nan
, если у вас его нет.
Я попробовал :
sorteos_anteriores ['categorias'] = sorteos_anteriores(sorteos_anteriores.loc[:,'bolas_Acertadas':'estrellas_Acertadas'] == tabla_premios.iloc[ : ,0:2])
Также с where и merge, но ничего не работает.
Спасибо за вашу помощь.
Благодаря Cuina Max я смог это сделать.
Комментарии:
1. Почему слияние не сработало? Использование
how=outer
должно работать, заполняя NAs строками, которые не совпадаютcategoria_de_premios
.
Ответ №1:
# supposing that the indexes, starting from one, correspond to the the premiums
categoria_de_premios['Categoria'] = df.index
# Merge using pd.merge and the appropriate arguments
sorteos_anteriores = (sorteos_anteriores.merge(
categoria_de_premios,
how='outer',
left_on=['bolas_Acertadas','estrellas_Acertadas'],
right_on=['Numeros_acertados', 'Estrellas_acertadas']
)).drop(columns=['Numeros_acertados', 'Estrellas_acertadas'])
Комментарии:
1. Вы можете использовать
.index
для преобразования индекса в столбец, если индекс не отсортирован численно.2. Да, @Ehsan, ты абсолютно прав. Это также проще. Я обновил ответ.
3. Спасибо. Это работает. Хотя единственное, что я изменил, это HOW= «inner». Спасибо.