使用iterable进行设置时,必须具有相等的len键和值

时间:2017-12-28 00:35:04

标签: python pandas

我有两个数据帧作为流程:

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是引用引导数据帧的第一列的索引。

我想创建数据集,而不是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

1 个答案:

答案 0 :(得分:4)

您可以使用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

现在我们可以concat使用original updated未经修改的列(我们称之为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

注意:在此处使用original可能更为清晰,但这是使用updated合并assignDatasetLabel.assign(**updated) 的另一种更清洁的方式:

*