#python #pandas
Вопрос:
Я новичок в Python. Я работаю с Python 3.6.
У меня есть следующий фрейм данных панд:
import pandas as pd data = [[1.5, 2,1.5,0.8], [1.2, 2,1.5,3], [2, 2,1.5,1]] df = pd.DataFrame(data, columns = ['Floor', 'V1','V2','V3']) df
По сути, для каждой строки, если значение в столбце V1
меньше значения Floor
, то я хочу установить значение V1
равным Floor
.
Операцию необходимо расширить для каждой строки и для каждого столбца (т. Е. от столбца V1
к столбцу V3
, где для каждой строки одно и то же Floor
).
В этом примере результат будет следующим:
data = [[1.5, 2,1.5,1.5], [1.2, 2,1.5,3], [2, 2,2,2]]
Есть идеи, как этого добиться? Я смотрел на функцию where
, но не уверен, как ее развернуть.
Заранее большое спасибо.
Ответ №1:
Вы можете использовать clip
:
df = df.clip(lower=df['Floor'], axis=0)
выход:
gt;gt;gt; df Floor V1 V2 V3 0 1.5000 2 1.5000 1.5000 1 1.2000 2 1.5000 3.0000 2 2.0000 2 2.0000 2.0000
если у вас есть другие столбцы
cols = df.filter(regex='Vd ').columns df[cols] = df[cols].clip(lower=df['Floor'], axis=0)
Ответ №2:
Я бы предложил использовать numpy’s np.where()
. Это позволяет сравнивать и обновлять базу столбцов по критериям if/else. Пожалуйста, попробуйте:
df['V1'] = np.where(df['V1'] lt; df['Floor'],df['Floor'],df['V1']
За этим следует то же V2
самое для V3
и.
Ответ №3:
Воспользуйся:
df.update( df.mask(df.loc[:, 'V1':'V3'].lt(df['Floor'], axis=0), df['Floor'], axis=0)) print (df) Floor V1 V2 V3 0 1.5 2 1.5 1.5 1 1.2 2 1.5 3.0 2 2.0 2 2.0 2.0