Замена значений, превышающих число в 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]

Edit:

У моего фактического кадра данных около 20 000 строк, и каждая строка имеет список размером 2000.

Есть ли способ использовать функцию numpy.minimum для каждой строки? Я предполагаю, что он будет быстрее, чем метод list comprehension?

Ответ 1

Вы можете использовать apply с list 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]

Ответ 2

Очень просто: df[df > 9] = 11

Ответ 3

Вы можете использовать цифровую индексацию, доступ к .values осуществляется через функцию .values.

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

где вы заменяете любое значение больше x на значение y.

Итак, для примера в вопросе:

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

Ответ 4

Привет, спасибо за это решение, оно мне тоже помогло, но у меня есть еще один вопрос к этому. У меня есть CSV файл с большим количеством значений с плавающей запятой и хочу выполнить следующее:

Где значение v> 0,001 = 1 и где значение v <-0.001 = -1. Все значения между (0,001; -0, 001) должны быть установлены на 0 или удалены.

Я попробовал следующее для первых двух шагов:

import pandas as pd
import numpy as np

df = pd.read_csv('data.csv')

a = np.array(df['score'].values.tolist())
#print(a)

df['text']=np.where(a > 0.001, 1, a).tolist()
df['text']=np.where(a < -0.001, -1, a).tolist()
print(df)

При таком подходе я получаю только -1 в своем списке, значения +1 игнорируются. Кто-нибудь может мне помочь, пожалуйста?

Ответ 5

Я пришел к решению заменить каждый элемент больше h на 1, иначе 0, что имеет простое решение:

df = (df > h) * 1

(Это не решает вопрос об OP, поскольку все df & lt; = h заменены на 0.)