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().
これを行う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
新しい列を作成するc2
、c1
がValue
である場合を除き、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
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
試してください:
df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)
次の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']