Редактировать дубликаты в панде - PullRequest
0 голосов
/ 04 октября 2018

У меня есть таблица, содержащая имена узлов, координаты узла и координаты узла.Некоторые из них содержат одинаковые координаты x и y.Я хочу построить эту таблицу в виде рассеяния, чтобы визуализировать схемы узлов.Для этого я не хочу, чтобы узлы (с одинаковыми значениями x & y) накладывались друг на друга на графике, поскольку это не благоприятствует представлению в виде схемы.Итак, я хочу изменить координаты X, чтобы они располагались рядом друг с другом.

Пример:

a, 10, 30
b, 10, 30
c, 10, 30
d, 50, 80
e, 90, 60
f, 100, 20
g, 120, 40
h, 120, 40
i, 120, 40

Узлы a, b и c перекрывают друг друга.Измените их координаты (например, на 10%), см. Прикрепленное изображение.

Схема

Моим первым шагом было округление результатов и получение возможных дубликатов с помощью:

pd.concat(g for _, g in df.groupby("x") if len(g) >1)

Теперь я совершенно не уверен, как мне поступитьпродолжать.Может ли кто-нибудь помочь мне здесь, пожалуйста?

1 Ответ

0 голосов
/ 04 октября 2018

Попробуйте следующий подход.

def adjust(x):
    # create a list of numbers to multiply (adjust)
    # the original data by
    if not len(x) % 2:
        r = range(-(len(x)//2), (len(x)//2))
    else:
        r = range(-(len(x)//2), (len(x)//2)+1)
    mult = list(map(lambda x: 1+x/10, r))
    return x*mult

# find all duplicates
dup = df.duplicated(subset='x', keep=False)
# update the values of duplicates using the above function
df.loc[dup, 'x'] = df[dup].groupby('x').x.apply(adjust)

Пример:

Входные данные :

a, 10, 30
b, 10, 30
c, 10, 30
d, 50, 80
e, 90, 60
f, 100, 20
g, 120, 40
h, 120, 40
i, 120, 40

Выходной кадр данных:

   node x        y
0   a   9.0     30
1   b   10.0    30
2   c   11.0    30
3   d   50.0    80
4   e   90.0    60
5   f   100.0   20
6   g   96.0    40
7   h   108.0   40
8   i   120.0   40
9   j   132.0   40
10  k   144.0   40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...