【问题标题】:Array length does not match index when creating a Dataframe创建数据框时数组长度与索引不匹配
【发布时间】:2022-11-25 06:37:30
【问题描述】:

我正在构建一个数据框:

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

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

我怎样才能解决这个问题?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    推测

    您在 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 提供每一列相同长度的数据。


    注意:我打算以更简洁的格式提供此信息作为评论,但我没有足够的声誉来发表评论。

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2012-11-05
      相关资源
      最近更新 更多