Установка значений в Pandas DataFrame с .at, непонятная ошибка типа

1

Я создаю панду Dataframe для некоторого ML. X Dataframe имеет индекс даты, состоящий из всех существующих дат из моих различных файлов данных:

all_index=set()
for table in data:
    for date in table.index.values:
        all_index.add(date)

Затем я создаю свою переменную данных, где хочу объединить все имеющиеся у меня данные:

temp2= np.empty((len(all_index),1,))
temp2[:]=np.nan
X=pd.DataFrame(temp2, all_index)

И, конечно же, теперь я хочу заполнить его данными (данные 1 DF, позже это будет список DF):

for i in X.index.values:
    for j in data[0].index.values:
        if(j==i):
            X.at[i, 0] = data['Column Name'][i]

Ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-73-73562c8b1e98> in <module>
      8             #X[i]=data[0]['BCH-USD'][i]
      9             elem = data[0]['BCH-USD'][str(i)]
---> 10             X.at[i, 0] = elem
     11             #print(X[0][i])
     12             print(data[0]['BCH-USD'][i])

~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
   2157         key = list(self._convert_key(key, is_setter=True))
   2158         key.append(value)
-> 2159         self.obj._set_value(*key, takeable=self._takeable)
   2160 
   2161 

~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\frame.py in _set_value(self, index, col, value, takeable)
   2580             series = self._get_item_cache(col)
   2581             engine = self.index._engine
-> 2582             engine.set_value(series._values, index, value)
   2583             return self
   2584         except (KeyError, TypeError):

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.set_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.set_value()

pandas/_libs/src\util.pxd in util.set_value_at()

pandas/_libs/src\util.pxd in util.set_value_at_unsafe()

ValueError: setting an array element with a sequence.

Что я пробовал:

Эта ошибка странная, так как set_value устарела. А на странице документа написано использовать .at. И .at использует set_value...

Я также пытался увидеть тип типа переменных (data ['Column Name'] [i]) → it float64

Я также пытался конвертировать с помощью pd.is_numeric. Та же ошибка

Я пытаюсь распечатать данные ['Имя столбца'] [i] в цикле, без ошибок. Если я попытаюсь распечатать X, также без ошибок.

Если я попытаюсь без цикла: X.at ['2018-11-24', 0] = data ['Имя столбца'] [0] Это работает...

Я ожидаю получить:

DataFrame с индексом всех дат в моих нескольких файлах csv в виде столбцов значений (если они есть) из моих файлов csv. Если нет в наличии, просто нан.

Теги:
pandas
dataframe
setvalue

2 ответа

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

Наконец-то мне удалось решить мою проблему с помощью join(), чего раньше мне не удавалось.

Сначала я создаю временный DataFrame, который будет иметь все возможные даты:

all_dates=set()
for table in data:
    for ind in table.index.values:
        all_dates.add(table['Date'][ind])

dates_list=list(all_dates)
Data={'Date': dates_list}
temp=pd.DataFrame(Data)
temp.sort_values(by=['Date'], inplace=True, ascending=True)
temp=temp.reset_index(drop=True)

Затем я присоединил этот временный Dataframe к своему списку Dataframe, извлеченному из CSV (сверху, так как он имеет большинство индексов):

data.insert(0,temp)
dfs = [df.set_index('Date') for df in data]
df_final=dfs[0].join(dfs[1:])

Таким образом, df_final имеет Dates в качестве индекса (отсортировано), а столбцы являются столбцами только извлеченных Dataframes.

Преимущество этого метода состоит в том, что когда один источник данных не является полным, в df_final будет "nan" вместо строки меньше, и все значения из других источников будут потеряны на эту дату.

0

Вероятно, ошибка связана с тем, что вы используете цепную индексацию, чего вам следует избегать. Попробуйте использовать:

for i in X.index.values:
    for j in data[0].index.values:
        if(j==i):
            X.at[i, 0] = data['Column Name'].at[i]

Кроме того, посмотрите на эту документацию: http://pandas.pydata.org/pandas-docs/stable/indexing.html

  • 0
    Благодарю. но ошибка все та же. Что-то я тоже не понимаю: почему моя переменная X заполнена правильными значениями с появлением ошибки?
  • 0
    Есть ли у вас дубликаты в индексе?
Показать ещё 2 комментария

Ещё вопросы

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