【问题标题】:Python Pandas Dataframe ValueError: Must have equal len keys and value when setting with an iterablePython Pandas Dataframe ValueError:使用可迭代设置时必须具有相等的 len 键和值
【发布时间】:2021-07-18 01:20:01
【问题描述】:

我有一个如下所示的数据框:

       PR         Order     Season  Rj
0   3001913971  3445046069  202112  NaN
1   3002026058  1445132366  202121  NaN
2   3002026059  1445132365  202122  NaN
3   3002026063  1445132367  202211  NaN
4   3002026069  1445132375  202121  NaN

当我第一次运行下面的代码时,它工作正常

df['Season'] = df['Season'].astype(str)
df.loc[(df['Season'].str[-2:] == '11') & (df['Season'].str.len() == 6),'Season'] = 'Spring ' + df.loc[df['Season'].str[-2:] == '11','Season'].str[:4]
df.loc[(df['Season'].str[-2:] == '12') & (df['Season'].str.len() == 6),'Season'] = 'Summer ' + df.loc[df['Season'].str[-2:] == '12','Season'].str[:4]
df.loc[(df['Season'].str[-2:] == '21') & (df['Season'].str.len() == 6),'Season'] = 'Autumn ' + df.loc[df['Season'].str[-2:] == '21','Season'].str[:4]
df.loc[(df['Season'].str[-2:] == '22') & (df['Season'].str.len() == 6),'Season'] = 'Holiday ' + df.loc[df['Season'].str[-2:] == '22','Season'].str[:4]

第一次运行的结果是这样的。

      PR           Order    Season       Rj
0   3001913971  3445046069  Summer 2021  NaN
1   3002026058  1445132366  Autumn 2021  NaN
2   3002026059  1445132365  Holiday 2021 NaN
3   3002026063  1445132367  Spring 2022  NaN
4   3002026069  1445132375  Autumn 2021  NaN

但是当我第二次运行它时,它会引发错误

ValueError: Must have equal len keys and value when setting with an iterable

你知道为什么吗?非常感谢

【问题讨论】:

  • 为什么要跑两次?
  • 我只是不小心运行了第二次并得到了这样的错误,所以想知道原因来帮助我更好地理解 pandas 数据框,因为我是一个 python 初学者
  • 你从哪里得到数据框?可能是dataframe的源数据发生了变化,导致输出数据发生了变化。
  • 这是我的 google drive 中的一个 excel 文件,我在 google colab 中运行代码
  • colab 根本不稳定。在您的本地计算机上运行它,它可能会正常工作。

标签: python pandas dataframe


【解决方案1】:

当您第二次运行代码时,Season 字符串的长度都不再为 6(并且它们都没有 11 作为最后两个字母),因此您的代码的第二行应该分配字符串'Spring ' 到数据帧的一个空切片,这当然是不可能的。

一般来说,当您像这样提取数据时,最好保留原始列并将派生值添加为附加列。这避免了上述问题,也可能有助于捕获错误。冗余可能是一件好事。顺便说一句,您也可以直接从整数值中提取数据,而无需先将它们转换为字符串。您只需要楼层除法和模运算符:

df['Year'] = df.Season // 100
df['Season_cat'] = (df.Season % 100).astype('category').cat.rename_categories(
    {11: 'Spring', 12: 'Summer', 21: 'Autumn', 22: 'Holiday'})

df
    PR          Order       Season  Rj      Year    Season_cat
0   3001913971  3445046069  202112  NaN     2021    Summer
1   3002026058  1445132366  202121  NaN     2021    Autumn
2   3002026059  1445132365  202122  NaN     2021    Holiday
3   3002026063  1445132367  202211  NaN     2022    Spring
4   3002026069  1445132375  202121  NaN     2021    Autumn

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2022-10-03
    • 2022-01-20
    • 2017-12-16
    • 2020-01-08
    • 2016-11-24
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多