Панды, как разместить массив в одной ячейке данных?

3

Поэтому в настоящее время у меня есть dataframe, который выглядит так:

Изображение 174551

И я хочу добавить совершенно новый столбец под названием "Predictors" только с одной ячейкой, содержащей массив.

Итак, [0, "Предикторы"] должны содержать массив, и все ниже этой ячейки в том же столбце должно быть пустым.

В этой попытке я попытался создать отдельный блок данных, содержащий только столбец "Predictors", и попытался добавить его к текущему фреймворку данных, но я получаю: "Несоответствие длины: ожидаемая ось имеет 3 элемента, новые значения имеют 4 элемента".

Как добавить отдельную ячейку, содержащую массив, в мою фреймворк?

# create a list and dataframe to hold the names of predictors
dataframe=dataframe.drop(['price','Date'],axis=1)  
predictorsList = dataframe.columns.get_values().tolist()
predictorsList = np.array(predictorsList, dtype=object)

# Combine actual and forecasted lists to one dataframe
combinedResults = pd.DataFrame({'Actual': actual, 'Forecasted': forecasted})

predictorsDF = pd.DataFrame({'Predictors': [predictorsList]})

# Add Predictors to dataframe
#combinedResults.at[0, 'Predictors'] = predictorsList
pd.concat([combinedResults,predictorsDF], ignore_index=True, axis=1)
  • 0
    (1) Pandas не предназначен для работы с элементами массива. Это плохая идея иметь массивы в качестве элементов. (2) В пандах нет таких вещей, как пустые клетки. Каждая ячейка должна иметь значение. (3) Почему бы не оставить предиктор в своей собственной переменной?
  • 0
    Списки в «ячейках» Панд могут быть немного непростыми, поскольку они пригодны для непреднамеренного вещания. Добавление вызова без вещания при назначении значения, например list(list_variable) может помочь в этом, предотвращая вещание. Очевидно, это можно использовать только тогда, когда вещание не нужно.
Теги:
pandas
dataframe
data-science
statistics

2 ответа

0
Лучший ответ

Вы можете заполнить остальные ячейки в нужном столбце с помощью NaN, но они не будут "пустыми". Для этого используйте pd.merge для обоих индексов:

Настроить

import pandas as pd
import numpy as np

df = pd.DataFrame({
     'Actual': [18.442, 15.4233, 20.6217, 16.7, 18.185], 
     'Forecasted': [19.6377, 13.1665, 19.3992, 17.4557, 14.0053]
})

arr = np.zeros(3)
df_arr = pd.DataFrame({'Predictors': [arr]})

Объединение df и df_arr

result = pd.merge(
    df,
    df_arr,
    how='left',
    left_index=True, # Merge on both indexes, since right only has 0...
    right_index=True # all the other rows will be NaN
)

Результаты

>>> print(result)
    Actual  Forecasted       Predictors
0  18.4420     19.6377  [0.0, 0.0, 0.0]
1  15.4233     13.1665              NaN
2  20.6217     19.3992              NaN
3  16.7000     17.4557              NaN
4  18.1850     14.0053              NaN

>>> result.loc[0, 'Predictors']
array([0., 0., 0.])

>>> result.loc[1, 'Predictors'] # actually contains a NaN value
nan 
0

Вам нужно сначала изменить тип объекта столбца (в вашем случае Predictors)

import pandas as pd
import numpy as np


df=pd.DataFrame(np.arange(20).reshape(5,4), columns=list('abcd'))
df=df.astype(object)  # this line allows the signment of the array
df.iloc[1,2] = np.array([99,99,99])
print(df)

дает

    a   b             c   d
0   0   1             2   3
1   4   5  [99, 99, 99]   7
2   8   9            10  11
3  12  13            14  15
4  16  17            18  19

Ещё вопросы

Сообщество Overcoder
Наверх
Меню