У меня есть набор данных с одним типом данных, распределенный по нескольким столбцам.Я хотел бы уменьшить их до одного столбца.У меня есть функция, которая выполняет это, но это громоздкий процесс, и я надеюсь, что есть более чистый способ сделать это.Вот игрушечный пример моих данных:
UID COMPANY EML MAI TEL
273 7UP nan nan TEL
273 7UP nan MAI nan
906 WSJ nan nan TEL
906 WSJ EML nan nan
736 AIG nan MAI nan
Что я хотел бы получить:
UID COMPANY CONTACT_INFO
273 7UP MT
906 WSJ ET
736 AIG M
Я решил это, написав функцию, которая преобразует EML
,MAI
или TEL
в простое число, агрегирует результаты, а затем преобразует сумму в составляющие типы контактов.Это работает и довольно быстро.Вот пример:
def columnRedux(df):
newDF = df.copy()
newDF.fillna('-', inplace=True)
newDF['CONTACT_INFO'] = newDF['EML'] + newDF['MAI'] + newDF['TEL']
newDF.replace('EML--', 7, inplace=True)
newDF.replace('-MAI-', 101, inplace=True)
newDF.replace('--TEL', 1009, inplace=True)
small = newDF.groupby(['UID', 'COMPANY'], as_index=False)['CONTACT_INFO'].sum()
small.replace(7, 'E', inplace=True)
small.replace(101, 'M', inplace=True)
small.replace(108, 'EM', inplace=True)
small.replace(1009, 'T', inplace=True)
small.replace(1016, 'ET', inplace=True)
small.replace(1110, 'MT', inplace=True)
small.replace(1117, 'EMT', inplace=True)
return small
df1 = pd.DataFrame(
{'EML' : [np.nan, np.nan, np.nan, 'EML', np.nan, np.nan, 'EML', np.nan, np.nan, 'EML', 'EML', np.nan],
'MAI' : [np.nan, 'MAI', np.nan, np.nan, 'MAI', np.nan, np.nan, np.nan, 'MAI', np.nan, np.nan, 'MAI'],
'COMPANY' : ['7UP', '7UP', 'UPS', 'UPS', 'UPS', 'WSJ', 'WSJ', 'TJX', 'AIG', 'CDW', 'HEB', 'HEB'],
'TEL' : ['TEL', np.nan, 'TEL', np.nan, np.nan, 'TEL', np.nan, 'TEL', np.nan, np.nan, np.nan, np.nan],
'UID' : [273, 273, 865, 865, 865, 906, 906, 736, 316, 458, 531, 531]},
columns=['UID', 'COMPANY', 'EML', 'MAI', 'TEL'])
cleanDF = columnRedux(df1)
Моя проблема в том, что у меня есть несколько наборов данных, каждый со своим собственным набором "широких" столбцов.У некоторых есть 5+ столбцов, которые будут уменьшены.Жесткое кодирование преобразований для всех вариантов не является тривиальным.Есть ли более чистый способ сделать это?