1. ホーム
  2. python

[解決済み] Pandas/Python。ある列の値を別の列の値に基づいて設定する

2022-12-11 18:50:06

質問

Pandasのデータフレームで、あるカラムの値を別のカラムの値に基づいて設定する必要があります。これはロジックです。

if df['c1'] == 'Value':
    df['c2'] = 10
else:
    df['c2'] = df['c3']

私はこれが私が望むこと、つまり単に新しい値を持つ列を作成すること(または既存の列の値を変更すること:私のためにどちらかが動作します)を行うために取得することはできません。

もし私が上記のコードを実行しようとしたり、関数として書いてapplyメソッドを使用すると、次のようになります。

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

どのように解決するのですか?

を使ったインデックス作成が一つの方法でしょう。 .loc .

データフレームの例がないので、ここで作ってみます。

import numpy as np
import pandas as pd

df = pd.DataFrame({'c1': list('abcdefg')})
df.loc[5, 'c1'] = 'Value'

>>> df
      c1
0      a
1      b
2      c
3      d
4      e
5  Value
6      g

仮に、あなたが 新しいカラムを作成する c2 と同じです。 c1 ただし c1Value である場合、それを10に割り当てたいと思います。

まず、新しいカラムを作成します。 c2 と等価になるように設定します。 c1 と等価になるように設定します(基本的に同じことをします)。

df = df.assign(c2 = df['c1'])
# OR:
df['c2'] = df['c1']

次に c1 と等しい 'Value' を使って .loc で、希望する値を c2 に希望する値を代入します。

df.loc[df['c1'] == 'Value', 'c2'] = 10

で、結局こうなる。

>>> df
      c1  c2
0      a   a
1      b   b
2      c   c
3      d   d
4      e   e
5  Value  10
6      g   g

もし、あなたが質問で提案したように、時には 既に持っているカラムの値を置き換える をしたい場合、新しいカラムを作成するのではなく、カラムの作成をスキップして、次のようにしてください。

df['c1'].loc[df['c1'] == 'Value'] = 10
# or:
df.loc[df['c1'] == 'Value', 'c1'] = 10

与えること。

>>> df
      c1
0      a
1      b
2      c
3      d
4      e
5     10
6      g