Сократить несколько идентификаторов в нескольких столбцах - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть DF с макетом ниже. Фактическая таблица находится в диапазоне + 10 м строк, поэтому на большей стороне.

df = pd.DataFrame({'id1' : ['12a', '13b', '14c', '15d', '16e', '18g', '17f', '19h']
                     ,'id2' : ['16e', '17f', '18g', '19h','12a', '14c','13b', '15d']
                     ,'var1' : [i for i in range(8)]
                     ,'var2' : list(np.random.randint(100, size = 8))
                     ,'var3' : [1, 2, np.nan, 3, 2, np.nan, np.nan, 34]
     })
>>> df
   id1  id2  var1  var2  var3
0  12a  16e     0    66   1.0
1  13b  17f     1     9   2.0
2  14c  18g     2    48   NaN
3  15d  19h     3    13   3.0
4  16e  12a     4    67   2.0
5  18g  14c     5    88   NaN
6  17f  13b     6    92   NaN
7  19h  15d     7    99  34.0

Я хочу уменьшить идентификаторы в DF, который идет парами, например, id1 индексная строка 0 с id2 индексная строка 4. Все идентификаторы существуют в двух строках, и мне нужно проверить каждую строку и удалить одну из строк. В настоящее время у меня есть решение, которое является изменением строки и немного медленным.

Обратите внимание, что нельзя просто опустить нижнюю часть DF (индексная строка 4 и далее), поскольку необходимо проверить все идентификаторы ( id1 vs id2 ).

Финальный стол будет выглядеть так:

id1 id2  var1 var2
12a 16e  66   1.0
13b 17f  9    2.0
14c 18g  48   NaN
15d 19h  13   3.0

Все «быстрые» решения высоко ценятся.

1 Ответ

0 голосов
/ 24 апреля 2018

Я считаю возможным сортировать столбцы по строкам и фильтровать только первые строки по DataFrame.duplicated с boolean indexing и инвертировать маску по ~:

np.random.seed(2018)

df = pd.DataFrame({'id1' : ['12a', '13b', '14c', '15d', '16e', '18g', '17f', '19h']
                     ,'id2' : ['16e', '17f', '18g', '19h','12a', '14c','13b', '15d']
                     ,'var1' : [i for i in range(8)]
                     ,'var2' : list(np.random.randint(100, size = 8))
                     ,'var3' : [1, 2, np.nan, 3, 2, np.nan, np.nan, 34]
})

df = df[~pd.DataFrame(np.sort(df[['id1', 'id2']], 1)).duplicated()]
print (df)
   id1  id2  var1  var2  var3
0  12a  16e     0    62   1.0
1  13b  17f     1    59   2.0
2  14c  18g     2    58   NaN
3  15d  19h     3    72   3.0

Подробнее

print (pd.DataFrame(np.sort(df[['id1', 'id2']], 1)))
     0    1
0  12a  16e
1  13b  17f
2  14c  18g
3  15d  19h
4  12a  16e
5  14c  18g
6  13b  17f
7  15d  19h

print (~pd.DataFrame(np.sort(df[['id1', 'id2']], 1)).duplicated())
0     True
1     True
2     True
3     True
4    False
5    False
6    False
7    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...