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

我正在为一些机器学习构建一个熊猫数据框。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):


我试过的:


这个错误很奇怪,因为 set_value 已被弃用。并且文档页面说使用 .at。.at 使用 set_value ...


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


我也尝试使用 pd.is_numeric 进行转换。同样的错误


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


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


我希望得到:


一个 DataFrame 将我的多个 csv 文件中的所有日期作为索引,作为我的 csv 文件中的值(如果可用)的列。如果不可用,就 nan。


慕的地10843
浏览 278回答 2
2回答

红糖糍粑

我终于通过使用 join() 解决了我的问题,我以前没有管理过。首先,我构建了一个具有所有可能日期的临时 DataFrame:all_dates=set()for table in data:&nbsp; &nbsp; for ind in table.index.values:&nbsp; &nbsp; &nbsp; &nbsp; 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)然后,我将该临时数据框加入了我从 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”而不是少一行并丢失该日期其他源的所有值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python