【问题标题】:Must have equal len keys and value when setting with an iterable使用可迭代设置时必须具有相等的 len 键和值
【发布时间】:2018-06-08 13:45:55
【问题描述】:

我有两个数据框如下:

leader:
    0 11
    1 8
    2 5
    3 9
    4 8
    5 6
    [6065 rows x 2 columns]

DatasetLabel:    
    Unnamed: 0      0    1  ....    7     8    9  10  11  12  
    0               A    J  ....    1     2    5 NaN NaN NaN  
    1               B    K  ....    3     4   NaN  NaN NaN NaN  

    [4095 rows x 14 columns]

信息数据集列名 0 到 6 是关于数据的 DatasetLabel,7 到 12 是引用领导者 Dataframe 第一列的索引。

我想创建数据集,而不是 DatasetLabel 数据集中的索引,我拥有来自领导数据集的每个索引的值,即leader.iloc[index,1]

如何使用 python 功能做到这一点?

输出应如下所示:

 DatasetLabel:    
        Unnamed: 0      0    1  ....    7     8    9  10  11  12  
        0               A    J  ....    8     5    6 NaN NaN NaN  
        1               B    K  ....    9     8   NaN  NaN NaN NaN  

我想出了以下内容,但出现错误:

    for column in DatasetLabel.ix[:,8:13]:
        DatasetLabel[DatasetLabel[column].notnull ()]=leader.iloc[DatasetLabel[DatasetLabel[column].notnull ()][column].values,1]

错误:

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

【问题讨论】:

  • 你能举例说明你的预期输出吗?目前还不清楚你在问什么。似乎您想要匹配从 DatasetLabelleader 的值,但第 7-12 列的每一行都有不同的值。那么你想用哪一个来匹配呢?
  • 我已经添加了一个例子

标签: python pandas


【解决方案1】:

有一个特殊的动作:当我在以下环境中运行python脚本时,出现错误:(stderr) ValueError: Must have equal len keys and value when setting with an iterable

操作系统:Linux Redhat 8.2

Python 版本3.8.5

我更改了以下两件事并解决了问题:

  1. 检查Linux文件夹和python源代码文件的访问权限,普通用户登录时不要直接使用root权限。您可以使用chownchgrp 来更改它们。
  2. pandas版本从高版本改为低版本,卸载最新的高版本pandas包后,安装1.1.3版本pandas包,问题解决。您可以使用以下命令:
# uninstall pandas package
pip uninstall pandas

# re-install the pandas package
pip install pandas==1.1.3

【讨论】:

    【解决方案2】:

    您可以使用apply 来索引leader 并与DatasetLabel 交换值,尽管它不是很漂亮。

    一个问题是 Pandas 不允许我们使用 NaN 进行索引。转换为 str 提供了一种解决方法。但这会产生第二个问题,即列9 的类型为float(因为NaNfloat),所以5 变为5.0。一旦它是一个字符串,那就是"5.0",它将无法匹配leader 中的索引值。我们可以删除.0,然后这个解决方案就可以工作了——但这有点小技巧。

    DatasetLabel 为:

       Unnamed:0  0  1  7  8    9  10  11  12
    0          0  A  J  1  2  5.0 NaN NaN NaN
    1          1  B  K  3  4  NaN NaN NaN NaN
    

    leader 一样:

       0   1
    0  0  11
    1  1   8
    2  2   5
    3  3   9
    4  4   8
    5  5   6
    

    然后:

    cols = ["7","8","9","10","11","12"]
    updated = DatasetLabel[cols].apply(
        lambda x: leader.loc[x.astype(str).str.split(".").str[0], 1].values, axis=1)
    
    updated
         7    8    9  10  11  12
    0  8.0  5.0  6.0 NaN NaN NaN
    1  9.0  8.0  NaN NaN NaN NaN
    

    现在我们可以使用updatedconcat 未修改的列(我们将其称为original):

    original_cols = DatasetLabel.columns[~DatasetLabel.columns.isin(cols)]
    original = DatasetLabel[original_cols]
    pd.concat([original, updated], axis=1)
    

    输出:

       Unnamed:0  0  1    7    8    9  10  11  12
    0          0  A  J  8.0  5.0  6.0 NaN NaN NaN
    1          1  B  K  9.0  8.0  NaN NaN NaN NaN
    

    注意:这里使用concat 可能更清楚,但这是合并originalupdated 的另一种更简洁的方法,使用assign

    DatasetLabel.assign(**updated)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2022-10-03
      • 1970-01-01
      • 2020-01-08
      • 2011-10-21
      • 2012-05-09
      • 2014-09-18
      相关资源
      最近更新 更多