1. ホーム
  2. パイソン

[解決済み】複数のカラムを参照するPandasの「apply」関数が動作しないのはなぜですか?[クローズド]

2022-04-01 03:35:13

質問

以下のデータフレームで複数のカラムを使用する場合、Pandasのapply関数でいくつかの問題が発生します。

df = DataFrame ({'a' : np.random.randn(6),
                 'b' : ['foo', 'bar'] * 3,
                 'c' : np.random.randn(6)})

と、次のような関数があります。

def my_test(a, b):
    return a % b

この関数を.NETで適用しようとすると

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)

エラーメッセージが表示されるのですが。

NameError: ("global name 'a' is not defined", u'occurred at index 0')

私はこのメッセージを理解していません、私は適切に名前を定義しました。

この問題に関してご助言いただけると幸いです。

更新情報

ありがとうございました。確かにコードの構文に間違いがあり、インデックスは''と入れるべきでした。しかし、次のようなもっと複雑な関数を使用しても同じ問題が発生します。

def my_test(a):
    cum_diff = 0
    for ix in df.index():
        cum_diff = cum_diff + (a - df['a'][ix])
    return cum_diff 

解決方法は?

を忘れているようです。 '' という文字列があります。

In [43]: df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1)

In [44]: df
Out[44]:
                    a    b         c     Value
          0 -1.674308  foo  0.343801  0.044698
          1 -2.163236  bar -2.046438 -0.116798
          2 -0.199115  foo -0.458050 -0.199115
          3  0.918646  bar -0.007185 -0.001006
          4  1.336830  foo  0.534292  0.268245
          5  0.976844  bar -0.773630 -0.570417

ちなみに、私見ですが、以下の方法の方がよりエレガントだと思います。

In [53]: def my_test2(row):
....:     return row['a'] % row['c']
....:     

In [54]: df['Value'] = df.apply(my_test2, axis=1)