Когда операция применяется между двумя кадрами данных, она транслируется на уровне элемента. Элементом в вашем случае является список, и когда между двумя списками применяется оператор «+», он объединяет их. Вот почему результирующий фрейм данных содержит составные списки.
Может быть несколько подходов для фактического суммирования элементов списков вместо конкатенации.
Одним из подходов может быть преобразование элементов списка в столбцы с последующим добавлением кадров данных и последующим объединением столбцов в единый список (что было предложено в первом ответе, но неверным способом)
Шаг 1: преобразование элементов списка в столбцы
df1=df1.apply(lambda row:pd.Series(row[0]), axis=1)
df2=df2.apply(lambda row:pd.Series(row[0]), axis=1)
Нам нужно передать строку [0] вместо строки, чтобы избавиться от индекса столбца, связанного с рядом.
Шаг 2: Добавить фреймы данных
df=df1+df2 #this dataframe will have 500 columns
Шаг 3: Объединить столбцы обратно в списки
df=df.apply(lambda row:pd.Series({0:list(row)}),axis=1)
Это интересная часть. Почему мы возвращаем серию сюда? Почему только возврат списка (строки) не работает и сохраняет 500 столбцов?
Причина в том, что если длина возвращаемого списка равна длине столбцов в начале, то этот список помещается в столбцы, и нам кажется, что ничего не произошло. Принимая во внимание, что если длина списка не равна количеству столбцов, то он возвращается как один список.
Давайте рассмотрим пример.
Предположим, у меня есть фрейм данных, имеющий столбцы 0, 1 и 2.
df=pd.DataFrame({0:[1,2,3],1:[4,5,6],2:[7,8,9]})
0 1 2
0 1 4 7
1 2 5 8
2 3 6 9
Количество столбцов в исходном фрейме данных равно 3. Если я пытаюсь вернуть список с двумя столбцами, он работает, и возвращается серия,
df1=df.apply(lambda row:[row[0],row[1]],axis=1)
0 [1, 4]
1 [2, 5]
2 [3, 6]
dtype: object
Вместо этого, если попытаться вернуть список из трех чисел, он уместится в столбцах.
df1=df.apply(list,axis=1)
0 1 2
0 1 4 7
1 2 5 8
2 3 6 9
Так что, если мы хотим вернуть список того же размера, что и количество столбцов, мы должны будем вернуть его в виде Серии, где значение одной строки было задано в виде списка.
Другой подход может состоять в том, чтобы ввести один столбец кадра данных в другой, а затем добавить столбцы с помощью функции apply.
df1[1]=df2[0]
df=df1.apply(lambda r: list(np.array(r[0])+np.array(r[1])),axis=1)
Мы можем воспользоваться здесь массивами numpy. Оператор '+' для массивов numpy суммирует соответствующие значения и дает один массив numpy.