#python #pandas #duplicates
#python #pandas #дубликаты
Вопрос:
У меня есть фрейм данных формы
person1, person2, ..., someMetric
John, Steve, ..., 20
Peter, Larry, ..., 12
Steve, John, ..., 20
Строки 0 и 2 являются взаимозаменяемыми дубликатами, поэтому я бы хотел удалить последнюю строку. Я не могу понять, как это сделать в Pandas.
Спасибо!
Комментарии:
1. Возможны ли дубликаты, определенные только person1 и person2, или задействованы другие столбцы?
2. Да, person1 и person2 являются уникальными идентификаторами. Есть и другие столбцы, но важные отношения существуют между двумя людьми.
3. Вы бы все равно удалили последнюю строку, если
someMetric
это какое-то число, отличное от20
? Кроме того, что, если последняя строка была точной копией первой строки, мы все равно ее удалим?4. Да, для всех пар строк R1 и R2, где R1.person1 = R2.person2 И R1.person2 = R2.person1 я хочу удалить R2
5. Я уже удалил все точные дубликаты
Ответ №1:
Вот решение на основе NumPy —
df[~(np.triu(df.person1.values[:,None] == df.person2.values)).any(0)]
Пример запуска —
In [123]: df
Out[123]:
person1 person2 someMetric
0 John Steve 20
1 Peter Larry 13
2 Steve John 19
3 Peter Parker 5
4 Larry Peter 7
In [124]: df[~(np.triu(df.person1.values[:,None] == df.person2.values)).any(0)]
Out[124]:
person1 person2 someMetric
0 John Steve 20
1 Peter Larry 13
3 Peter Parker 5
Ответ №2:
подход в pandas
df = pd.DataFrame(
{'person2': {0: 'Steve', 1: 'Larry', 2: 'John', 3: 'Parker', 4: 'Peter'},
'person1': {0: 'John', 1: 'Peter', 2: 'Steve', 3: 'Peter', 4: 'Larry'},
'someMetric': {0: 20, 1: 13, 2: 19, 3: 5, 4: 7}})
print(df)
person1 person2 someMetric
0 John Steve 20
1 Peter Larry 13
2 Steve John 19
3 Peter Parker 5
4 Larry Peter 7
df['ordered-name'] = df.apply(lambda x: '-'.join(sorted([x['person1'],x['person2']])),axis=1)
df = df.drop_duplicates(['ordered-name'])
df.drop(['ordered-name'], axis=1, inplace=True)
print df
что дает:
person1 person2 someMetric
0 John Steve 20
1 Peter Larry 13
3 Peter Parker 5