У меня есть решение, но оно не изящно, я умоляю опытных пользователей взглянуть на это.
, чтобы облегчить другим, вот код для настройки тестового примера:
df1 = pd.DataFrame(
columns=\
'ID Value Name Score'.split(),
data = [
re.split('\s{2,}', line) for line in \
"""
-1 10 A -1
-1 5 B -1
NaN 0.2 Track C 100
NaN 0.5 Track C 200
1 0 D 100
5 0 D 200
""".strip().split('\n')
],
)
df1 = df1.replace({'NaN':np.nan})
df2 = pd.DataFrame(
columns=\
'Score ID'.split(),
data = [
re.split('\s{2,}', line) for line in \
"""
100 1
100 2
100 3
100 4
200 5
200 6
200 7
""".strip().split('\n')
],
)
и мое решение:
"""
the general first reaction is to pd.merge().
however the hurdle is, how to deal with the fillna of the column "ID".
mine works, but it is too hard coded.
"""
df = pd.merge(left=df1, right=df2, on='Score', how='left')
df['ID'] = df['ID_x'].fillna(df['ID_y'])
finalresult = df.drop(columns=['ID_x', 'ID_y']).drop_duplicates(subset=['ID','Name'])
ВЫВОД:
Value Name Score ID
0 10 A -1 -1
1 5 B -1 -1
2 0.2 Track C 100 1
3 0.2 Track C 100 2
4 0.2 Track C 100 3
5 0.2 Track C 100 4
6 0.5 Track C 200 5
7 0.5 Track C 200 6
8 0.5 Track C 200 7
9 0 D 100 1
13 0 D 200 5