#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')