Как сравнить значения разных столбцов с помощью pandas [duplicate]

Intro

Нижеприведенный сценарий позволяет запомнить уровни яркости в зависимости от источника питания, используемого ноутбуком. По умолчанию он составляет 50% от батареи, 90% - от переменного тока.

Intro

source_monitor.sh [-a INT] [-b INT] [-v] [-h]

-a set initial brightness on AC adapter
-b set initial brightness on batter
-v enable verbose output
-h prints this help text

Установка

Установка с использованием git через терминал:

Запустить [ f4] для установки git Запустить mkdir $HOME/bin. Пропустите этот шаг, если $HOME/bin уже существует cd $HOME/bin Запуск git clone https://github.com/SergKolo/sergrep.git Сценарий будет находиться в $HOME/bin/sergrep/source_monitor.sh. Убедитесь, что сценарий выполним с помощью chmod +x $HOME/bin/sergrep/source_monitor.sh Добавьте скрипт в качестве приложения для запуска. Найдите меню «Запуск приложений» в режиме поиска Unity Dash или Gnome. Кроме того, запустите меню gnome-session-properties в терминале, чтобы запустить меню. Добавьте полный путь к скрипту в качестве приложения для запуска, чтобы он запускался при каждом входе в графический интерфейс.

В качестве альтернативы вы можете скопировать и сохранить исходный код сценария самостоятельно, chmod +x file и пройти описанный выше шаг #.

Чтобы сценарий автоматически запускался каждый раз при входе в систему в Gnome или Unity, используйте утилиту Startup Applications.

Установка

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# Date: June 18th 2016
# Purpose: Script that remembers and sets brightness
#      depending on power sources
# 
# Written for: https://askubuntu.com/q/788383/295286
# Tested on: Ubuntu 16.04 LTS , Ubuntu Kylin 16.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.

ARGV0="$0"
ARGC=$#
wait_ac_connect()
{
  while ! on_ac_power ; do : ; sleep 0.25 ; done
  $VERBOSE && echo "<<< adapter plugged in"
}

wait_ac_disconnect()
{
  while on_ac_power ; do : ; sleep 1.25 ; done 
  $VERBOSE && echo "<<< adapter unplugged"
}

change_brightness()
{
  qdbus org.gnome.SettingsDaemon \
       /org/gnome/SettingsDaemon/Power \
      org.gnome.SettingsDaemon.Power.Screen.SetPercentage "$1"
}

get_brightness()
{
  qdbus org.gnome.SettingsDaemon \
        /org/gnome/SettingsDaemon/Power \
        org.gnome.SettingsDaemon.Power.Screen.GetPercentage
}

print_usage()
{
cat <<EOF

source_monitor.sh [-a INT] [-b INT] [-v] [-h]

-a set initial brightness on AC adapter
-b set initial brightness on batter
-v enable verbose output
-h prints this help text

Copyright Serg Kolo , 2016
EOF
}

parse_args()
{
 # boiler-pate code for reusing, options may change
 local OPTIND opt  # OPTIND must be there, 
                   # opt can be renamed to anything
 # no leading : means errors reported(which is what i want)
 # : after letter means options takes args, no :  - no args
 while getopts "a:b:vh" opt
 do
   case ${opt} in
      a)  AC_PERCENTAGE="${OPTARG}"
        ;;
      b) BAT_PERCENTAGE="${OPTARG}"
        ;;
      v) VERBOSE=true
        ;;
      h) print_usage && exit 0
        ;;
     \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
    esac
  done
  shift $((OPTIND-1))
}

main()
{

    # default values, if -a,-b, or -v options given
    # they will be changed
    local BAT_PERCENTAGE=50
    local AC_PERCENTAGE=90
    local VERBOSE=false # for debugging

    parse_args "$@"

    while true
    do

      if on_ac_power ; then
         wait_ac_disconnect
          AC_PERCENTAGE=$(($(get_brightness)+1)) # too long to explain why +1
                         # just try it for yourself
          sleep 0.25
          change_brightness "$BAT_PERCENTAGE" > /dev/null
      else
          wait_ac_connect
          BAT_PERCENTAGE=$(($(get_brightness)+1))
          sleep 0.25
          change_brightness "$AC_PERCENTAGE" > /dev/null
      fi

      sleep 0.25

    done

}

main "$@"
29
задан 2 January 2017 в 15:29

4 ответа

Вы можете использовать .equals для столбцов или целых фреймов данных.

df['col1'].equals(df['col2'])

Если они равны, этот оператор вернет True, else False.

12
ответ дан 15 August 2018 в 16:53

Один из способов - использовать булевскую серию для индексации столбца df['one']. Это дает вам новый столбец, в котором записи True имеют то же значение, что и в той же строке, что и df['one'], а значения False равны NaN.

Булева серия задана только вашим if (хотя для & необходимо использовать and):

>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
    one two three   que
0   10  1.2 4.2      10
1   15  70  0.03    NaN
2   8   5   0       NaN

Если вы хотите, чтобы значения NaN были заменены другими значениями, вы можете использовать fillna в новом столбце que. Я использовал 0 вместо пустой строки здесь:

>>> df['que'] = df['que'].fillna(0)
>>> df
    one two three   que
0   10  1.2   4.2    10
1   15   70  0.03     0
2    8    5     0     0
7
ответ дан 15 August 2018 в 16:53

Вы можете использовать apply () и сделать что-то вроде этого

df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

или если вы предпочитаете не использовать лямбда

def que(x):
    if x['one'] >= x['two'] and x['one'] <= x['three']:
        return x['one']
    else:
        ''
df['que'] = df.apply(que, axis=1)
18
ответ дан 15 August 2018 в 16:53
  • 1
    Я подозреваю, что это, вероятно, немного медленнее, чем другие опубликованные подходы, поскольку он не использует преимущества векторизованных операций, разрешенных пандами. – Marius 15 December 2014 в 02:51
  • 2
    Может быть. Мне нравится читаемость, хотя – Bob Haffner 15 December 2014 в 03:08
  • 3
    Могли бы добавить ответ, где def используется вместо лямбда, спасибо – Merlin 15 December 2014 в 03:14
  • 4
    c'mon, lambdas классные ;-) – Bob Haffner 15 December 2014 в 03:22
  • 5
    @BobHaffner: lambda не читаются при использовании сложных операторов if / then / else. – Merlin 15 December 2014 в 03:31

Оберните каждое отдельное условие в круглых скобках, а затем используйте оператор & для объединения условий:

df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']

Вы можете заполнить несоответствующие строки, просто используя ~ (" а не «оператор»), чтобы инвертировать совпадение:

df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''

Вам нужно использовать & и ~, а не and и not, поскольку работают операторы & и ~ элемент за элементом.

Конечный результат:

df
Out[8]: 
  one  two three que
0  10  1.2   4.2  10
1  15   70  0.03    
2   8    5     0  
4
ответ дан 15 August 2018 в 16:53

Другие вопросы по тегам:

Похожие вопросы: