pandas - Можно получить два условия для работы отдельно, но не вместе [дублировать]

JavaScript не имеет понятия списка фиксированных параметров. Для ваших собственных функций вы всегда можете указать столько параметров, сколько хотите, и передать их столько, сколько хотите.

Для встроенных функций, которые коррелируют с собственным кодом, это зависит от .

Вы спросили, от чего это зависит:

Давайте посмотрим на раздел ECMA-262

15 о встроенных (не путать с host ) вообще функциями

Если в описании конкретной функции не указано иное, если для функции или конструктора, описанной в этом разделе, дается меньше аргументов, чем требуется для функции, функция или конструктор должны вести себя точно так, как если бы ей были предоставлены достаточные дополнительные аргументы, каждый из которых был бы неопределенным значением.

blockquote>

Хорошо. Если я передаю меньше аргументов, чем необходимо, это зависит от функции самой функции (прокрутите вниз раздел 15, чтобы найти спецификацию для каждой встроенной функции).

Если в описании конкретной функции не указано иначе, если для функции или конструктора, описанной в этом разделе, дается больше аргументов, чем указано для функции, дополнительные аргументы вычисляются по вызову, а затем игнорируются функцией. Однако реализация может определять поведение конкретной реализации, относящееся к таким аргументам, пока поведение не является бросанием исключения TypeError, которое определяется просто наличием дополнительного аргумента.

blockquote>

Передача в слишком большом количестве аргументов никогда не следует поднимать TypeError. Но все же это может вызвать другие ошибки. Опять же, это зависит от функции, о которой вы говорите.

Вы говорили прямо о DOM, а не о встроенных функциях. Честно говоря, я не могу найти соответствующие части спецификации. Специфика ECMA намного проще читать, чем веб-сайт w3.

127
задан Ruthger Righart 28 May 2017 в 13:55
поделиться

2 ответа

Конечно! Настройка:

>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
                   'B': [randint(1, 9)*10 for x in xrange(10)],
                   'C': [randint(1, 9)*100 for x in xrange(10)]})
>>> df
   A   B    C
0  9  40  300
1  9  70  700
2  5  70  900
3  8  80  900
4  7  50  200
5  9  30  900
6  2  80  700
7  2  80  400
8  5  80  300
9  7  70  800

Мы можем применить операции столбца и получить объекты Boolean Series:

>>> df["B"] > 50
0    False
1     True
2     True
3     True
4    False
5    False
6     True
7     True
8     True
9     True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0    False
1    False
2     True
3     True
4    False
5    False
6    False
7    False
8    False
9    False

[Обновить, чтобы перейти к новому стилю .loc]:

И тогда мы можем использовать их для индексации в объект. Для доступа к чтению вы можете привязывать индексы:

>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2    5
3    8
Name: A, dtype: int64

, но вы можете столкнуться с проблемами из-за различий между представлением и копией, выполняющими это для доступа к записи. Вместо этого вы можете использовать .loc:

>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2    5
3    8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
      A   B    C
0     9  40  300
1     9  70  700
2  5000  70  900
3  8000  80  900
4     7  50  200
5     9  30  900
6     2  80  700
7     2  80  400
8     5  80  300
9     7  70  800

Обратите внимание, что я случайно сделал == 900, а не != 900 или ~(df["C"] == 900), но я слишком ленив, чтобы исправить это. Упражнение для читателя. : ^)

236
ответ дан DSM 16 August 2018 в 14:15
поделиться
  • 1
    Superb! Большое спасибо! – Gill Bates 9 March 2013 в 22:35
  • 2
    Как перезаписать (обновить) строки, полученные путем выбора? – Gill Bates 10 March 2013 в 13:26
  • 3
    О обновлении .loc - было бы хорошо, если бы вы уточнили, где мы получаем копию и где вид. – Gill Bates 20 June 2014 в 18:36
  • 4
    можно ли фильтровать рамку данных pandas и использовать оператор OR. Например, если был месяц столбца, вы могли бы сказать df = data ['month' == JAN OR 'month' == FEB]? И, возможно, включают в себя второй столбцы, делающие запрос более сложным, newdf, где col_month = jan ИЛИ feb И col_day = ПОНЕДЕЛЬНИК или ВЕНДЕНА – yoshiserry 27 November 2014 в 23:26
  • 5
    @yoshiserry: спрашивайте, как отдельный вопрос. Никто не увидит его здесь в комментариях к старому ответу. – DSM 27 November 2014 в 23:39

Другим решением является использование метода query :

import pandas as pd

from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
                   'B': [randint(1, 9) * 10 for x in xrange(10)],
                   'C': [randint(1, 9) * 100 for x in xrange(10)]})
print df

   A   B    C
0  7  20  300
1  7  80  700
2  4  90  100
3  4  30  900
4  7  80  200
5  7  60  800
6  3  80  900
7  9  40  100
8  6  40  100
9  3  10  600

print df.query('B > 50 and C != 900')

   A   B    C
1  7  80  700
2  4  90  100
4  7  80  200
5  7  60  800

Теперь, если вы хотите изменить возвращаемые значения в столбце A, вы можете сохранить их индекс:

my_query_index = df.query('B > 50 & C != 900').index

.... и использовать .iloc для их изменения, т. е.:

df.iloc[my_query_index, 0] = 5000

print df

      A   B    C
0     7  20  300
1  5000  80  700
2  5000  90  100
3     4  30  900
4  5000  80  200
5  5000  60  800
6     3  80  900
7     9  40  100
8     6  40  100
9     3  10  600
21
ответ дан Nikos Tavoularis 16 August 2018 в 14:15
поделиться
Другие вопросы по тегам:

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