使用 .at 在 Pandas DataFrame 中设置值,无法理解的类型错误

Setting values in Pandas DataFrame with .at, incomprehensible type error

我正在为一些 ML 构建一个 pandas 数据框。 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...

我还尝试查看变量的类型 type(data['Column Name'][i]) -> 它是 float64

我也试过用pd.is_numeric转换。同样的错误

我尝试在循环中打印出数据['Column Name'][i],没有错误。如果我尝试打印出 X,也没有错误。

如果我尝试不循环:X.at['2018-11-24', 0] = data['Column Name'][0] 有效...

我希望得到:

一个 DataFrame,其索引是我的多个 csv 文件中的所有日期,列是我的 csv 文件中的值(如果可用)。如果不可用,就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

我终于设法通过使用 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 加入到我从 CSV 中提取的 Dataframe 列表中(在顶部,因为它具有最多的索引):

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" 而不是少一行并丢失该日期其他来源的所有值.