web-dev-qa-db-ja.com

Pandas / Python:別の列の値に基づいて1つの列の値を設定します

Pandasデータフレーム内の別の列の値に基づいて1つの列の値を設定する必要があります。これがロジックです:

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().
26
NLR

これを行う1つの方法は、.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

新しい列を作成するc2c1Valueである場合を除き、c1と同等であると仮定した場合、 10に割り当てます。

まず、次の2行のいずれかを使用して、新しい列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
39
sacuL

np.where() を使用して、条件に基づいて値を設定できます。

#df
   c1  c2  c3
0   4   2   1
1   8   7   9
2   1   5   8
3   3   3   5
4   3   6   8

状態に基づいて、列['c2']の値を変更(または設定)します。

df['c2'] = np.where(df.c1 == 8,'X',df.c3)

  c1  c3 c4
0   4   1  1
1   8   9  X
2   1   8  8
3   3   5  5
4   3   8  8
8
DJK

試してください:

df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)

8
AlexanderHughes

次の2つの手順で行うことをお勧めします。

# set fixed value to 'c2' where the condition is met
df.loc[df['c1'] == 'Value', 'c2'] = 10

# copy value from 'c3' to 'c2' where the condition is NOT met
df.loc[df['c1'] != 'Value', 'c2'] = df[df['c1'] != 'Value', 'c3']
1
Ralf