Добавление списков, хранящихся в датафрейме - PullRequest
0 голосов
/ 28 августа 2018

У меня есть два кадра данных:

df1.ix[1:3]
DateTime
2018-01-02    [-0.0031537018416199097, 0.006451397621428631,...
2018-01-03    [-0.0028882814454597745, -0.005829869983964528...


df2.ix[1:3]
DateTime
2018-01-02    [-0.03285881500135208, -0.027806145786217932, ...
2018-01-03    [-0.0001314381449719178, -0.006278235444742629...

len(df1.ix['2018-01-02'][0])
500

len(df2.ix['2018-01-02'][0])
500

Когда я делаю df1 + df2 я получаю:

len((df1 + df2).ix['2018-01-02'][0])
1000

Итак, списки вместо суммирования объединяются.

Как добавить поэлементные списки в кадрах данных df1 and df2.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Когда операция применяется между двумя кадрами данных, она транслируется на уровне элемента. Элементом в вашем случае является список, и когда между двумя списками применяется оператор «+», он объединяет их. Вот почему результирующий фрейм данных содержит составные списки.

Может быть несколько подходов для фактического суммирования элементов списков вместо конкатенации.

Одним из подходов может быть преобразование элементов списка в столбцы с последующим добавлением кадров данных и последующим объединением столбцов в единый список (что было предложено в первом ответе, но неверным способом)

Шаг 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.

0 голосов
/ 28 августа 2018

Приведите их к сериям, чтобы они стали столбцами, затем добавьте свои dfs:

df1 = df1.apply(pd.Series, axis=1)
df2 = df2.apply(pd.Series, axis=1)

df1 + df2
...