Вы можете поместить столбцы ID1, ID2, ID3 в столбец ID и реплицировать записи учетной записи и дохода.
После этого вы можете выполнить левое соединение для обоих фреймов данных.
EDIT For часть кода:
import pandas as pd
import numpy as np
df = pd.DataFrame([
['A', 123, 789, 567, 900],
['B', 321, 234, 213, 400],
['C', None, 456, None, 700]
], columns=['Account', 'ID1', 'ID2', 'ID3', 'Revenue'])
df1 = pd.DataFrame([
['A', 'Tech', 123],
['B', 'Retail', 213],
['D', 'Legal', 111]
], columns = ['Account', 'Industry', 'ID'])
df_new = pd.DataFrame(columns=['Account', 'ID', 'Revenue'])
for ix in ['ID1', 'ID2', 'ID3']:
df_new = df_new.append(pd.DataFrame(df[['Account', ix, 'Revenue']].values,
columns=['Account', 'ID', 'Revenue']))
df_new = df_new.dropna()
df_new['ID'] = df_new['ID'].astype(int)
df_new.set_index('ID', inplace=True)
df1.set_index('ID', inplace=True)
output = df1.join(df_new, how='left', lsuffix='_from_df_new')
missing_accounts = set(df['Account'].unique()) - set(output['Account_from_df_new'].unique())
output = output.append(df_new[df_new['Account'].isin(missing_accounts)])
output['Account'] = output.apply(
lambda row:
row['Account']
if not pd.isnull(row['Account'])
else row['Account_from_df_new'], axis=1)
output.drop(columns=['Account_from_df_new']).reset_index()
Вывод:
ID Account Industry Revenue
0 123 A Tech 900
1 213 B Retail 400
2 111 D Legal NaN
3 456 C NaN 700