Проблема в выборе строк в пандах DataFrame - PullRequest
0 голосов
/ 18 февраля 2019

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

    for c in classes:
           print(X[y == c])

где X - это особенности выборок в DataFrame, y - это классы выборок в DataFrame, а c - это список меток классов.
Я использовал этот код для двух наборов данныхи он работает с набором данных, но не с другим, хотя оба формата отформатированы одинаково.

При наборе данных у меня возникла ошибка, я напечатал y == c с помощью:

     print(y == c)

и он вернул это:

           Classes
     0     True
     1     True
     2     True
           ...
     4572  False
     4573  False
     4574  False

Поэтому я предполагаю, что сопоставление условий работает правильно.
Однако, когда я печатаю X[y == c] по:

  print(X[y == c])

, результат будет примерно таким:

            0   1   2
     0    NaN NaN NaN
     1    NaN NaN NaN
     2    NaN NaN NaN
     3    NaN NaN NaN
           ...
     4574 NaN NaN NaN

К сведению, X и y - это обычный DataFrame, который выглядит следующим образом:
X

                     0           1          2
     0       -3.786900    9.411757  -2.246594
     1      742.632101  -74.001353  -0.567936
     2     2019.854074  102.077111 -23.776775
     3      -93.048341    3.008569  -1.043599
           ...
     4754  -247.754953   -6.851270  -0.984777

y

            Classes
     0      0
     1      0
     2      0
            ...
     4572   2
     4573   2
     4574   2

Canэта проблема будет решена?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я выяснил причину проблемы.
X и y имеют одинаковую длину.У меня была вышеупомянутая проблема только с Data1, но не с Data2.

Я проверил тип данных y в Data1 и Data2 и обнаружил, что y было

  • series.Series > с данными 2 (работает)
  • frame.DataFrame '> с данными 1 (не работает)


Я преобразовал y в Data1 в серии:

    y = y.ix[:,0]

, затем извлечение строк пришло кработать правильно.

0 голосов
/ 18 февраля 2019

Если в обоих DataFrames имеется одинаковая длина данных и одинаковые значения индекса, используйте DataFrame.eq по столбцу Classes вдоль оси 0 для логического значения DataFrame, затем проверьте хотя бы одинTrue за строку по DataFrame.any и фильтрацию по boolean indexing:

df = X[X.eq(Y['Classes'], axis=0).any(axis=1)]
...