web-dev-qa-db-ja.com

pandas dataframeの数値より大きい値を置き換える

次のような大きなデータフレームがあります。

df1['A'].ix[1:3]
2017-01-01 02:00:00    [33, 34, 39]
2017-01-01 03:00:00    [3, 43, 9]

9より大きい各要素を11に置き換えたい。

したがって、上記の例の望ましい出力は次のとおりです。

df1['A'].ix[1:3]
2017-01-01 02:00:00    [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]

編集:

実際のデータフレームには約20,000行あり、各行にはサイズ2000のリストがあります。

行ごとにnumpy.minimum関数を使用する方法はありますか? list comprehensionメソッドよりも高速になると思いますか?

13
Zanam

applylist comprehensionで使用できます:

df1['A'] = df1['A'].apply(lambda x: [y if y <= 9 else 11 for y in x])
print (df1)
                                A
2017-01-01 02:00:00  [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]

より高速なソリューションは、最初にnumpy arrayに変換してから numpy.where を使用します。

a = np.array(df1['A'].values.tolist())
print (a)
[[33 34 39]
 [ 3 43  9]]

df1['A'] = np.where(a > 9, 11, a).tolist()
print (df1)
                                A
2017-01-01 02:00:00  [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]
10
jezrael

非常に単純:df[df > 9] = 11

9
Edouard Cuny

.values関数を介してアクセスされるnumpyインデックスを使用できます。

df['col'].values[df['col'].values > x] = y

ここで、xより大きい値をyの値に置き換えます。

したがって、質問の例では:

df1['A'].values[df1['A'] > 9] = 11

2
D.Griffiths

Hよりも大きい各要素を1または0に置き換える解決策を見つけました。これには単純な解決策があります。

df = (df > h) * 1

(これは、すべてのdf <= hが0に置き換えられるため、OPの問題を解決しません。)

0
CFW