Я создаю панду 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. Если нет в наличии, просто нан.
Наконец-то мне удалось решить мою проблему с помощью 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" вместо строки меньше, и все значения из других источников будут потеряны на эту дату.
Вероятно, ошибка связана с тем, что вы используете цепную индексацию, чего вам следует избегать. Попробуйте использовать:
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