Фильтрация кадра данных pandas по двум столбцам - PullRequest
3 голосов
/ 25 февраля 2020

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

Machine   Position
  M01         PB0
  M02         PB0
  M03         PB0
  M04         PB0
  M01         PB1
  M02         PB1
  M01         PB1
  M01         PB1

Выше вы можете видеть, что все машины имеют Позицию PB0, но только две машины имеют и PB0, и PB1, теперь я ожидаю, возможно, список машин, которые имеют как PB0, так и PB0. PB1 machine=['M01','M02'] Следует учитывать, что среди этих двух столбцов может быть много дубликатов.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Давайте определим ваш фрейм данных:

import pandas as pd
df = pd.DataFrame({'Machine': {0: 'M01',
  1: 'M02',
  2: 'M03',
  3: 'M04',
  4: 'M01',
  5: 'M02',
  6: 'M01',
  7: 'M01'},
 'Position': {0: 'PB0',
  1: 'PB0',
  2: 'PB0',
  3: 'PB0',
  4: 'PB1',
  5: 'PB1',
  6: 'PB1',
  7: 'PB1'}})

Чтобы получить позиции каждой машины, независимо от дубликатов, мы можем использовать:

s = df.groupby('Machine')['Position'].apply(set)

Что выглядит следующим образом:

Machine
M01    {PB1, PB0}
M02    {PB1, PB0}
M03         {PB0}
M04         {PB0}
Name: Position, dtype: object

Чтобы получить только машины, позиции которых включают в себя PB0 и PB1, мы можем использовать

s[s.apply(lambda x: x.issuperset({'PB1','PB0'}))].index

, который возвращает

Index(['M01', 'M02'], dtype='object', name='Machine')

(вы также можете добавить .to_list() в конце, если вы предпочитаете список для индекса pd.Index)

1 голос
/ 25 февраля 2020

Вы можете сделать

new_df = df.groupby("machine").count().reset_index()
m = new_df[new_df["Position"]==2]["machine"].tolist()
print(m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...