Python Pandas - Удаление строк из DataFrame на основе ранее полученного подмножества

Я запускаю Python 2.7 с установленной библиотекой Pandas 0.11.0.

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

Допустим, что мои данные в df1 выглядят следующим образом:

df1=

  zip  x  y  access
  123  1  1    4
  123  1  1    6
  133  1  2    3
  145  2  2    3
  167  3  1    1
  167  3  1    2

Используя, например, df2 = df1[df1['zip'] == 123], а затем df2 = df2.join(df1[df1['zip'] == 133]) я получаю следующий поднабор данных:

df2=

 zip  x  y  access
 123  1  1    4
 123  1  1    6
 133  1  2    3

Я хочу сделать следующее:

1) Удалите строки из df1, поскольку они определены/объединены с df2

ИЛИ

2) После того, как df2 был создан, удалите строки (разность?) из df1, которые df2 состоят из

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

EDIT:

В идеале будет создан третий фреймворк, который выглядит так:

df2=

 zip  x  y  access
 145  2  2    3
 167  3  1    1
 167  3  1    2

То есть все от df1 не в df2. Спасибо!

Ответ 1

Приходят на ум два варианта. Сначала используйте isin и маску:

>>> df
   zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2
>>> keep = [123, 133]
>>> df_yes = df[df['zip'].isin(keep)]
>>> df_no = df[~df['zip'].isin(keep)]
>>> df_yes
   zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3
>>> df_no
   zip  x  y  access
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2

Во-вторых, используйте groupby:

>>> grouped = df.groupby(df['zip'].isin(keep))

а затем любой из

>>> grouped.get_group(True)
   zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3
>>> grouped.get_group(False)
   zip  x  y  access
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2
>>> [g for k,g in list(grouped)]
[   zip  x  y  access
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2,    zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3]
>>> dict(list(grouped))
{False:    zip  x  y  access
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2, True:    zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3}
>>> dict(list(grouped)).values()
[   zip  x  y  access
3  145  2  2       3
4  167  3  1       1
5  167  3  1       2,    zip  x  y  access
0  123  1  1       4
1  123  1  1       6
2  133  1  2       3]

Что наиболее важно, зависит от контекста, но я думаю, что вы поняли эту идею.