Панды удаляют строки с несколькими критериями - PullRequest
0 голосов
/ 01 июня 2018

Рассмотрим следующие фреймы данных панд:

df = pd.DataFrame({
    'case_id': [1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051],
    'elm_id': [101, 102, 101, 102, 101, 102, 101, 102],
    'cid': [1, 1, 2, 2, 1, 1, 2, 2],
    'fx': [736.1, 16.5, 98.8, 158.5, 272.5, 750.0, 333.4, 104.2],
    'fy': [992.0, 261.3, 798.3, 452.0, 535.9, 838.8, 526.7, 119.4],
    'fz': [428.4, 611.0, 948.3, 523.9, 880.9, 340.3, 890.7, 422.1]})

Когда напечатано выглядит так:

   case_id  cid  elm_id     fx     fy     fz
0     1050    1     101  736.1  992.0  428.4
1     1050    1     102   16.5  261.3  611.0
2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9
4     1051    1     101  272.5  535.9  880.9
5     1051    1     102  750.0  838.8  340.3
6     1051    2     101  333.4  526.7  890.7
7     1051    2     102  104.2  119.4  422.1

Мне нужно удалить строки, где 'case_id' = значения в списке и 'cid '= значения в списке.Для простоты давайте просто используем списки с одним значением: cases = [1051] и ids = [1] соответственно.В этом сценарии я хочу, чтобы новый фрейм данных имел (6) рядов данных.Это должно выглядеть так, потому что две строки, соответствующие моим критериям, должны быть удалены:

   case_id  cid  elm_id     fx     fy     fz
0     1050    1     101  736.1  992.0  428.4
1     1050    1     102   16.5  261.3  611.0
2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9
4     1051    2     101  333.4  526.7  890.7
5     1051    2     102  104.2  119.4  422.1

Я пробовал несколько разных вещей, таких как:

df2 = df[(df.case_id != subcase) & (df.cid != commit_id)]

Но это возвращает результат, противоположный тому, что я ожидал:

2     1050    2     101   98.8  798.3  948.3
3     1050    2     102  158.5  452.0  523.9

Я также пытался использовать .query(): df.query('(case_id != 1051) & (cid != 1)'), но получил те же (2) строки результатов.

Любая помощь и / или объяснения будут с благодарностью.

1 Ответ

0 голосов
/ 01 июня 2018

Ваш код ищет строки, которые соответствуют критериям, а не отбрасывает их.Вы можете отбросить строки, используя .drop () . Используйте следующее:

df.drop(df.loc[(df['case_id'].isin(cases)) & (df['cid'].isin(ids))].index)

Вывод:

     case_id    cid elm_id  fx  fy  fz
0   1050    1   101 736.1   992.0   428.4
1   1050    1   102 16.5    261.3   611.0
2   1050    2   101 98.8    798.3   948.3
3   1050    2   102 158.5   452.0   523.9
6   1051    2   101 333.4   526.7   890.7
7   1051    2   102 104.2   119.4   422.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...