创建数据框时,数组长度与索引不匹配



我正在构建一个数据框架:

datetoday = (pd.to_datetime(files[-1]['file_published'], format='%d.%m.%Y %H:%M')).strftime('%Y-%m-%d')
datetoday
Out[66]: '2022-11-23'
dates = pd.Series(np.arange(1, 337, 1))
dates
Out[68]: 
0        1
1        2
2        3
3        4
4        5
... 
331    332
332    333
333    334
334    335
335    336
Length: 336, dtype: int64

然后添加一个数据列:

data = pd.read_excel(files[0]['file_path'], sheet_name='Sheet1', engine='openpyxl').iloc[1:, 3:].astype(
float).dropna(axis=1).values.flatten()
len(data)
Out[73]: 336

但是当我创建最终的数据帧时:

df = pd.DataFrame({'datecreated': datetoday, 'timestamp': dates, 'ipto_weekly_forecast': data})

我得到以下错误:

ValueError: array length 0 does not match index length 336

奇怪的是,错误发生在木星上,但在PyCharm的本地df得到构建没有问题。

我该如何解决这个问题?

猜想

您在Jupyter上使用的旧版本的pandas对您使用标量指定datecreated列的方式很挑剔。值(注意,对于其他两列,您使用列表/数组指定) .

<标题>

解决方案下面的修复将适用于任何版本的pandas(考虑到datesdata列表的长度实际上是336):

df = pd.DataFrame({
'datecreated': [datetoday]*336,
'timestamp': dates,
'ipto_weekly_forecast': data
})

下面是一个使用模拟数据的例子。

dates = pd.Series(np.arange(1, 337, 1))
data = pd.Series(np.arange(1, 337, 1))
datetoday = '2022-11-23'
df = pd.DataFrame({'datecreated': [datetoday]*336, 'timestamp': dates, 'ipto_weekly_forecast': data})

解决方案有效,因为表达式[datetoday]*336的计算结果为长度为336的列表,每个值都等于datetoday。现在,我们为pandas提供每列相同长度的数据。


注:我打算以更精简的格式提供这些信息作为评论,但我没有足够的声誉来评论。

最新更新