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