У меня есть следующие два кадра данных:
df1
col1 col2
A 5, 3, 4
B 5, 1
C 3, 4
дф2
c1 c2
1 XXX
2 CCC
3 AAA
4 DDD
5 FFF
Скрипт для создания df1и df2:
import pandas as pd
data1 = [['A', '5, 3, 4'], ['B', '5, 1'], ['C', '3, 4']]
df1 = pd.DataFrame(data1, columns = ['col1', 'col2'])
data2 = [['1', 'XXX'], ['2', 'CCC'], ['3', 'AAA'], ['4', 'DDD'], ['5', 'FFF']]
df2 = pd.DataFrame(data2, columns = ['c1', 'c2'])
Мне нужно расширить col2in df1и объединить расширенные столбцы c2с df2by c1.
Я знаю, как расширить col2, но проблема в том, что количество развернутых значений отличается для разных строк. Поэтому я не знаю, как слиться df_expandedс df2.
df_expanded = df1['col2'].str.split(', ', expand=True)
Ожидаемый результат:
col1 col2_1 col2_2 col2_3 col2_1_title col2_2_title col2_3_title
A 5 3 4 FFF AAA DDD
B 5 1 FFF XXX
C 3 4 AAA DDD
Как я могу получить такой результат?
Решение проблемы
Вот один из подходов, использующий сложенные данные для a mergeи преобразование в MultiIndex. Обратите внимание, что у него немного другой вывод:
df3 = (df1['col2']
.str.split(', ', expand=True)
.stack()
#.astype(int) # only if df2 has integers in c1
.to_frame('col2')
.merge(df2.set_index('c1').rename(columns={'c2': 'col2_title'}),
left_on='col2', right_index=True)
.unstack(1)
)
df3.columns = df3.columns.map(lambda x: f'{x[0]}_{x[1]}')
df_expand = df1[['col1']].join(df3)
выход:
col1 col2_0 col2_1 col2_2 col2_title_0 col2_title_1 col2_title_2
0 A 5 3 4 FFF AAA DDD
1 B 5 1 NaN FFF XXX NaN
2 C 3 4 NaN AAA DDD NaN
Комментариев нет:
Отправить комментарий