Использование кортежа для сопоставления значений между фреймами данных

#python #pandas

#python #pandas

Вопрос:

Если мне нужно сопоставить одно значение между двумя фреймами данных и получить значение ‘FD’ из строки, где Round = 1, идентификатор равен 262:

 df1 = pd.DataFrame({'Round':1,'ID':262,'FD':30,
                     'Round':2,'ID':262,'FD':20}, index=[0])

df2 = pd.DataFrame({'Round':1, 'Opponent':262,
                    'Round':2, 'Opponent':262},index=[0])
  

Я попытался сопоставить с:

 df2['P_GS_by_FD'] = f2['Opponent'].map(df1.set_index('ID')['FD'])
  

df2 Ожидаемый результат:

   Round    Opponent  P_GS_by_FD
      1      262          30
  

Комментарии:

1. Можете ли вы показать ожидаемый результат? , Также вы df1 не можете быть созданы ~

2. пожалуйста, обратитесь к моей правке

3. Мне все еще непонятно….

4. @BEN_YO Я предполагаю, что ожидаемый результат был неправильным

5. Почему мы не выбрали раунд 2?

Ответ №1:

Я бы использовал drop_duplicates

это позволило бы выбрать строки ‘Round 1’

 df1.drop_duplicates('Id', keep='first')


df2['P_GS_by_FD'] = df2['Opponent'].map(df1.drop_duplicates('Id', keep='first').set_index('Id')['FD'])
  

(Я думаю, что ваш пример df1, df2 будет содержать только одну строку вместо двух)

Комментарии:

1. проблема в том, что в реальном сценарии идентификатор повторяется много-много раз, поэтому сохранять first или last последним не вариант…

2. Но разве вы не говорили, что round id уникален? тогда как насчет того, чтобы сначала выбрать раунд, а затем выбрать идентификатор? df1[df1['Round'] ==1]['Id']

Ответ №2:

Затем нам нужно также создать раунд в df2

 df2['Round'] = df.groupby('Opponent').cumcount() 1
yourdf = df2.merge(df1.rename(columns={'Id' : 'Opponent'}), on = ['Opponent','Round'], how = 'left')
  

Основывайтесь на своем обновлении

 yourdf = df2.merge(df1.rename(columns={'ID' : 'Opponent'}), on = ['Opponent','Round'], how = 'left')