1. ホーム
  2. python

[解決済み] pandasで特定の条件を満たした行の値を更新する

2022-06-01 16:36:30

質問

以下のようなデータフレームがあるとします。

カラムの値を更新する最も効率的な方法は何ですか? feat 別のfeat ここで ストリーム は番号 2 ?

これでしょうか?

for index, row in df.iterrows():
    if df1.loc[index,'stream'] == 2:
       # do something

UPDATEです。 100以上のカラムがある場合はどうすればいいですか?更新したいカラムに明示的に名前をつけたくありません。各カラムの値を2で割りたい(ストリームカラムを除く)。

だから、私の目標が何であるかを明確にするために。

ストリーム 2 を持つすべての行のすべての値を 2 で割りますが、ストリーム列は変更しません。

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

私はあなたが使用することができると思います loc を使えばいいと思います。

df1.loc[df1['stream'] == 2, ['feat','another_feat']] = 'aaaa'
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2        aaaa         aaaa
c       2        aaaa         aaaa
d       3  some_value   some_value

更新を別にする必要がある場合、一つの選択肢として使用します。

df1.loc[df1['stream'] == 2, 'feat'] = 10
print df1
   stream        feat another_feat
a       1  some_value   some_value
b       2          10   some_value
c       2          10   some_value
d       3  some_value   some_value

もう一つの一般的なオプションは numpy.where :

df1['feat'] = np.where(df1['stream'] == 2, 10,20)
print df1
   stream  feat another_feat
a       1    20   some_value
b       2    10   some_value
c       2    10   some_value
d       3    20   some_value

編集: もし、すべての列を stream という条件下で True を使用します。

print df1
   stream  feat  another_feat
a       1     4             5
b       2     4             5
c       2     2             9
d       3     1             7

#filter columns all without stream
cols = [col for col in df1.columns if col != 'stream']
print cols
['feat', 'another_feat']

df1.loc[df1['stream'] == 2, cols ] = df1 / 2
print df1
   stream  feat  another_feat
a       1   4.0           5.0
b       2   2.0           2.5
c       2   1.0           4.5
d       3   1.0           7.0

複数の条件を扱うことが可能な場合は、複数の numpy.where または numpy.select :

df0 = pd.DataFrame({'Col':[5,0,-6]})

df0['New Col1'] = np.where((df0['Col'] > 0), 'Increasing', 
                          np.where((df0['Col'] < 0), 'Decreasing', 'No Change'))

df0['New Col2'] = np.select([df0['Col'] > 0, df0['Col'] < 0],
                            ['Increasing',  'Decreasing'], 
                            default='No Change')

print (df0)
   Col    New Col1    New Col2
0    5  Increasing  Increasing
1    0   No Change   No Change
2   -6  Decreasing  Decreasing