Ограничьте значение каждого столбца в зависимости от значения ограничения в панд

#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