Попробовав решение, предложенное Желязным на относительно большом DataFrame (~ 400 тыс. строк), я нашел его очень медленным. Вот альтернатива, которую я обнаружил, чтобы быстрее выполнять заказы на моем наборе данных.
df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})
df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})
df_grouped = df_grouped.reset_index()
df_grouped = df_grouped.rename(columns={'count':'count_max'})
df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])
df = df[df['count'] == df['count_max']]
Нет. Расширение происходит до того, как команда будет запущена. Вы можете только отключить glob перед запуском команды или путем цитирования звезды.
$ # quote it
$ foo '*'
$ # or escape it
$ foo \*
$ # or disable the glob (noglob)
$ set -f
$ foo *
Остерегайтесь: если нет имен, соответствующих маске, bash передает аргумент as-is без расширения!
Proof (pa.py - очень простой скрипт, который просто печатает свои аргументы):
$ ls
f1.cc f2.cc pa.py
$ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
$ ./pa.py *.cpp
['./pa.py', '*.cpp']
set -o nullglob
или shopt -s failglob
, и это поведение изменится (двумя разными способами).
– Charles Duffy
1 December 2015 в 01:22
Расширение выполняется оболочкой перед запуском вашей программы. Ваша программа не имеет понятия, произошло ли расширение или нет.
set -o noglob
отключит расширение в вызывающей оболочке, но вам нужно будет сделать это перед , вы вызываете свою программу.
Альтернатива процитировать ваши аргументы, например
foo "*"
Хотя верно, что сама команда не может отключить глобус, пользователь может сказать оболочке Unix, чтобы не глотать определенную команду. Обычно это делается путем редактирования файлов конфигурации оболочки. Предполагая, что команда foo
может быть найдена по пути к команде, в соответствующий файл конфигурации необходимо добавить следующее:
Для оболочек sh, bash и ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
Для оболочек csh и tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
Для оболочки zsh:
alias foo='noglob foo'
Путь к командной строке не нужно использовать. Скажем, команда foo хранится в каталоге ~ / bin, а затем следующее:
Для оболочек sh, bash и ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
Для csh и tcsh shells:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Для оболочки zsh:
alias foo='noglob ~/bin/foo'
Все вышеперечисленное было протестировано с использованием OSX 10.9.2 от Apple. Примечание. При копировании вышеуказанного кода будьте осторожны при удалении любых пробелов. Они могут быть значительными.
Пользователь geira указал, что в случае оболочки bash
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
можно заменить на
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'
, что устраняет необходимость в функции foo.
Некоторые веб-сайты, используемые для создания этого документа:
Нет. Оболочка типа Bourne всегда выполняет globbing , когда это необходимо, перед выполнением команды. Пользователь должен указывать или избегать аргументов, чтобы предотвратить глобус, например foo \*
; фактическая выполняемая программа не может указывать предпочтения.
setopt
, но set -o noglob
.
– Anne van Rossum
4 December 2013 в 14:57
pwd
,echo *
является просто*
– sam boosalis 1 April 2014 в 00:48nullglob
отключена, слово остается неизменным. Если параметрnullglob
установлен, и совпадений не найдено, слово удаляется. & Quot; – Chris Middleton 6 February 2015 в 19:05