Как удалить строки из кадра данных Pandas, которые содержат комбинации первых двух столбцов - PullRequest
2 голосов
/ 03 июля 2019

Я пытаюсь избавиться от строк, которые содержат комбинации элементов первых двух столбцов в кадре данных pandas, например, в следующем df:

     event1    event2    uccs   ulags
0  327423.0  329243.0  0.1663 -0.6013
1  327423.0  329589.0  0.1911 -0.4730
2  329243.0  327423.0  0.1663  0.6013
3  329243.0  329589.0  0.3101 -0.7502
4  329589.0  327423.0  0.1911  0.4730
5  329589.0  329243.0  0.3101  0.7502

строки 0 и 2 представляют комбинациюэлементов: event1 и event2.То есть:

0  327423.0  329243.0
2  329243.0  327423.0

В общем, мне нужно уменьшить матрицу или df до 3 строк, удалив все дубликаты.

Я попробовал следующее безуспешно:

 u = df.filter(like='event1').values
 m = pd.DataFrame(np.sort(u, axis=1)).duplicated()

делая это, я получаю:

    event1    event2    uccs   ulags
0  327423.0  329243.0  0.1663 -0.6013
2  329243.0  327423.0  0.1663  0.6013
4  329589.0  327423.0  0.1911  0.4730

Однако, как вы можете видеть, строки 0 и 2 дублируются.Будем благодарны за любые советы о том, как сделать это в пандах или numpy.

1 Ответ

2 голосов
/ 03 июля 2019

Если я вас правильно понимаю, вы были достаточно близки, вам просто нужно передать свой логический массив обратно в ваш фрейм данных для boolean indexing:

df[~pd.DataFrame(np.sort(df.filter(like='event'), axis=1)).duplicated()]

     event1    event2    uccs   ulags
0  327423.0  329243.0  0.1663 -0.6013
1  327423.0  329589.0  0.1911 -0.4730
3  329243.0  329589.0  0.3101 -0.7502

Обратите внимание на ~, который я использовал, который является обратнымили оператор not :

m = pd.DataFrame(np.sort(df.filter(like='event'), axis=1)).duplicated()

print(m)

0    False
1    False
2     True
3    False
4     True
5     True
dtype: bool

Теперь обратный:

print(~m)

0     True
1     True
2    False
3     True
4    False
5    False
dtype: bool
...