Установка значений в Pandas DataFrame с .at, непонятная ошибка типа - PullRequest
0 голосов
/ 13 января 2019

Я создаю панду 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]) -> float64

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Мне наконец-то удалось решить мою проблему с помощью 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 имеет даты в качестве индекса (отсортировано), а столбцы являются столбцами только извлеченных фреймов данных.

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

0 голосов
/ 13 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...