pandas 创建 Dataframe 时数组长度与索引不匹配

cu6pst1q  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(350)

我正在从以下内容构建 Dataframe :

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

但是当我创建最终的 Dataframe 时:

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

出现以下错误:

ValueError: array length 0 does not match index length 336

奇怪的是,错误发生在Jupyter上,但在PyCharm本地,df的构建没有问题。
我该如何解决这个问题?

x33g5p2x

x33g5p2x1#

猜想

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

溶液

以下修复程序适用于任何版本的panda(假定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
注:我打算以更简洁的格式提供这些信息作为评论,但我没有足够的声誉发表评论。

相关问题