1. ホーム
  2. python

[解決済み】イテラブルで設定する場合、キーと値のlenが等しくなければならない

2022-02-23 21:28:23

質問

以下のような2つのデータフレームがあります。

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 Dataset のインデックスの代わりに、リーダーデータセットの各インデックスの値を持つデータセットを作りたいのですが、それは次のようなものです。 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

解決方法は?

を使用することができます。 apply へのインデックスを作成するために leader と値を交換します。 DatasetLabel あまりきれいではありませんが。

一つ問題なのは、Pandasがインデックスを作成する際に NaN . に変換すると str は回避策を提供します。 しかし、これによって2つ目の問題が発生します。すなわち、カラム 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 をマージする方法があります。 originalupdated を使用しています。 assign :

DatasetLabel.assign(**updated)