Pandas DataFrame: программное разделение строк в кадре данных в условиях нескольких столбцов - PullRequest
0 голосов
/ 11 декабря 2018

Context

Я работаю над DataFrame df с множеством столбцов, заполненных числовыми значениями

df
lorem ipsum  |  dolor sic  |  ...  |  (hundreds of cols)
---------------------------------------------------------
0.5          |     -6.2    |  ...  | 79.8
-26.1        |     6200.0  |  ...  | -65.2
150.0        |     3.14    |  ...  | 1.008

Другими словами, у меня есть list_cols столбцов:

list_cols = ['lorem ipsum', 'dolor sic', ... ]  # arbitrary length, of course len(list_cols ) <= len(df.columns), and contains valid columns of my df

Я хочу получить 2 кадра данных:

  • 1, который содержит все строки, где value < 0 хотя бы для одного из list_cols (соответствует OR),давайте назовем это negative_values_matches
  • 1, что соответствует оставшемуся кадру данных, назовем его positive_values_matches

Пример ожидаемого результата

для list_cols = ['lorem ipsum', 'dolor sic'], я получу кадры данных, в которых хотя бы 1 значение в list_cols строго отрицательно:

negative_values_matches
lorem ipsum  |  dolor sic  |  ...  |  (hundreds of cols)
---------------------------------------------------------
0.5          |     -6.2    |  ...  | 79.8
-26.1        |     6200.0  |  ...  | -65.2


positive_values_matches
lorem ipsum  |  dolor sic  |  ...  |  (hundreds of cols)
---------------------------------------------------------
150.0        |     3.14    |  ...  | 1.008

Я не хочу писать myslef такого рода код:

negative_values_matches = df[ (criterion1 | criterion2 | ... | criterionn)]
positive_values_matches = df[~(criterion1 | criterion2 | ... | criterionn)]

(где criterionk - логическое вычисление для столбца k, например: (df[col_k]>=0), здесь подразумевается скобка, так как используется синтаксис Pandas)

Идея состоит в том, чтобы иметь программный подход.Я в основном ищу массив логических значений, поэтому я могу затем использовать логическое индексирование (см. Документация Pandas ).

Насколько я могу судить, этисообщения не точно о чем я говорю:

Я не могу понять,как связать логические вычисления на моем DataFrame вместе с оператором OR и получить правильное разбиение строк.

Что я могу сделать?

1 Ответ

0 голосов
/ 11 декабря 2018

После нескольких попыток мне удалось достичь своей цели.

Вот код:

import Pandas
import numpy
# assume dataframe exists
df = ...
# initiliaze an array of False, matching df number of rows
resulting_bools = numpy.zeros((1, len(df.index)), dtype=bool)

for col in list_cols:
    # obtain array of booleans for given column and boolean condition for [row, column] value
    criterion = df[col].map(lambda x: x < 0) # same condition for each column, different conditions would have been more difficult (for me)

     # perform cumulative boolean evaluation accross columns
    resulting_bools |= criterion

# use the array of booleans to build the required df
negative_values_matches = df[ resulting_bools].copy() # use .copy() to avoid further possible warnings from Pandas depending on what you do with your data frame
positive_values_matches = df[~resulting_bools].copy()

Таким образом, я успешно получил 2 кадра данных:

  • 1 со всеми строками, имеющими значение <0 по крайней мере для 1 столбца в <code>list_cols
  • 1 со всеми другими строками (значение> = 0 для каждого столбца в list_col)

(Инициализация массива в False зависит от выбора булевых вычислений)


Примечание: подход можно объединить с несколькими условиями на фреймах данных .Подлежит подтверждению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...