Проблема
Я пытаюсь объединить / объединить наборы из нескольких столбцов с одинаковыми именами в наборы из отдельных столбцов.Например:
У меня есть фрейм данных, который содержит несколько столбцов с повторяющимися именами столбцов.Например, рассмотрим этот пример, где у меня есть два раза подмножество из нескольких столбцов с одинаковым именем столбца, например:
A A A B B
0 cute tall tall NaN old
1 NaN NaN 5 NaN NaN
2 1 old NaN cute big
Моя цель состоит в том, чтобы сопоставить каждое подмножество (AAA & BB) с его собственным одиночнымподмножество столбцов.Следующий желательный вывод иллюстрирует эту идею:
A_new B_new
0 "cute, tall" "old"
1 "5" NaN
2 "1, old" "cute, big"
Чтобы получить здесь, я применяю следующие 3 простые логики к входному фрейму данных:
- Объединяем все не-NaN значения ви сохраните его в новом столбце.
- При объединении значений, отличных от NaN, проверяйте наличие дубликатов и возвращайте только те, которые не являются дубликатами
- Если все значения являются NaN, возвращайте NaN
Мое текущее решение основано на циклах for, повторяющихся в каждой строке.Однако этот подход очень медленный, и мой фрейм данных довольно большой, поэтому мне интересно, есть ли более эффективный / быстрый способ достижения этого?
Это мое текущее (очень медленное) решение:
for c,j in tqdm(enumerate(columns)): # columns is a list holding all the relevant column names
merged_values = []
for i in (range(0,len(df))):
values = [x for x in df[j].iloc[i] if x is not np.nan]
values = list(set(values))
if values == []:
values = np.nan
#print(values)
elif len(values) > 1:
values = ", ".join(values)
else:
values = values[0]
merged_values.append(values)
if c == 0:
data = pd.DataFrame(merged_values,columns=[j+"_new"])
else:
data[j] = pd.DataFrame(merged_values,columns=[j+"_new])