Pythonラムダ関数の動的作成(パンダの例)

野菜のように

パンダのデータフレームを簡単にフィルタリングするためのラムダ関数を含む辞書を作成したいと思います。各辞書アイテムを1行ずつインスタンス化すると、希望する動作が得られます。しかし、forループを使用すると、フィルターは最後の値nを使用します。ラムダ関数は、インスタンス化時の値ではなく、グローバル変数nを参照しますか?ラムダ関数についての私の理解はずれていますか?

この例は骨抜きになっていることに注意してください。私の実際のプロジェクトでは、DateTimeインデックスを使用しており、辞書には年でフィルタリングする整数キーがあります。df.index.year == 2020、および週/週末、時刻などでフィルタリングするいくつかの文字列キー。

import pandas as pd

data = [[1,2],[3,4],[5,6]] # example df

df = pd.DataFrame(index=range(len(data)), data=data)

filts = {}
filts[1] = lambda df: df[df.index == 1]  # making a filter dictionary
filts[2] = lambda df: df[df.index == 2] # of lamda funcs

print(filts[1](df)) # works as expected
print(filts[2](df))

filts = {}
for n in range(len(data)):
    filts[n] = lambda df: df[df.index == n] # also tried wrapping n in int
# n = 0  # changes behaviour
print(filts[0](df))  # print out the results for n = 2
print(filts[1](df))  # same problem as above

# futher investigating lambdas
filts = {}
n = 0
filts[n] = lambda df: df[df.index == n]  # making a filter dictionary
n = 1
filts[n] = lambda df: df[df.index == n] # of lamda funcs
print(filts[0](df))  # print out the results for n = 1

DaveIdito

質問の重複性についてはよくわかりませんが、パンダを使ってこれに遭遇したので、答えています。クロージャーを使用して問題を解決できます。

次のようにループを変更します。

for n in range(len(data)):
    filts[n] = (lambda n: lambda df: df[df.index == n])(n)

OPのアプローチの何が問題になっていますか?

ラムダは変数への参照を維持します。したがって、これnはループ内で繰り返されている変数への参照です。ラムダ評価するとき、n(で定義されているすべてのラムダで、ループ内filtsの参照n割り当てられた最終値に割り当てられます。したがって、表示されているものが期待されます。要点- 「ラムダのクロージャは使用されている変数への参照であり、その値ではないため、後で変数の値が変更されると、クロージャの値も変更されます。 " source

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#でのインラインラムダ関数の作成動作

分類Dev

パンダのalign()関数:説明例

分類Dev

パンダでのラムダ関数の正しい使用

分類Dev

関数型パラダイムでの動的プログラミング

分類Dev

Pythonパンダ-他の列にアクセスするラムダ関数

分類Dev

パンダのラムダ関数表記

分類Dev

パンダのラムダ関数を理解する

分類Dev

マップパンダ内のラムダ関数

分類Dev

パンダ用のカスタム補間関数の作成

分類Dev

Javaでのランダムなint関数の動作

分類Dev

クムラチンの新しいカラム?Pythonパンダのウィンドウ関数?

分類Dev

不思議なPythonパンダラムダ関数エラー

分類Dev

パンダのデータフレームを動的にクエリする関数を作成する方法は?

分類Dev

パンダのラムダ関数でエラーが発生しました

分類Dev

python :(ラムダ)関数のdict

分類Dev

ランダム関数の列挙型

分類Dev

BigQueryのランダム文字列関数

分類Dev

関数内のラムダ

分類Dev

パンダ-ラムダ関数に適用される列の中央値

分類Dev

パンダのラムダ関数はNaNを認識しません

分類Dev

パンダはラムダ関数のnull値を適用します

分類Dev

パンダのloc関数

分類Dev

ラムダ関数とPythonでのフィルタリング

分類Dev

パンダのデータフレームの特定の行にラムダ関数を適用して新しい列を作成する方法

分類Dev

ラムダ関数のdictを使用したPythonでの奇妙な動作

分類Dev

Python /パンダ:マップ/ラムダの数式評価のバグ?

分類Dev

パンダ-関数を適用し、ラムダ関数を使用して複数の行を生成します

分類Dev

パンダのランダムな増加する数の列

分類Dev

Pandasのラムダ関数内のラムダ関数

Related 関連記事

  1. 1

    C#でのインラインラムダ関数の作成動作

  2. 2

    パンダのalign()関数:説明例

  3. 3

    パンダでのラムダ関数の正しい使用

  4. 4

    関数型パラダイムでの動的プログラミング

  5. 5

    Pythonパンダ-他の列にアクセスするラムダ関数

  6. 6

    パンダのラムダ関数表記

  7. 7

    パンダのラムダ関数を理解する

  8. 8

    マップパンダ内のラムダ関数

  9. 9

    パンダ用のカスタム補間関数の作成

  10. 10

    Javaでのランダムなint関数の動作

  11. 11

    クムラチンの新しいカラム?Pythonパンダのウィンドウ関数?

  12. 12

    不思議なPythonパンダラムダ関数エラー

  13. 13

    パンダのデータフレームを動的にクエリする関数を作成する方法は?

  14. 14

    パンダのラムダ関数でエラーが発生しました

  15. 15

    python :(ラムダ)関数のdict

  16. 16

    ランダム関数の列挙型

  17. 17

    BigQueryのランダム文字列関数

  18. 18

    関数内のラムダ

  19. 19

    パンダ-ラムダ関数に適用される列の中央値

  20. 20

    パンダのラムダ関数はNaNを認識しません

  21. 21

    パンダはラムダ関数のnull値を適用します

  22. 22

    パンダのloc関数

  23. 23

    ラムダ関数とPythonでのフィルタリング

  24. 24

    パンダのデータフレームの特定の行にラムダ関数を適用して新しい列を作成する方法

  25. 25

    ラムダ関数のdictを使用したPythonでの奇妙な動作

  26. 26

    Python /パンダ:マップ/ラムダの数式評価のバグ?

  27. 27

    パンダ-関数を適用し、ラムダ関数を使用して複数の行を生成します

  28. 28

    パンダのランダムな増加する数の列

  29. 29

    Pandasのラムダ関数内のラムダ関数

ホットタグ

アーカイブ