Изменение порядка элементов в строках в подмножестве столбцов в Pandas DataFrame с учетом информации в другом подмножестве столбцов - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть pandas DataFrame:

import pandas as pd

e = [{'E1': 'A', 'E2': 'B', 'E3': 'C', 'EDAY1': 0, 'EDAY2': 1, 'EDAY3': 2}, {'E1': 'B', 'E2': '0', 'E3': '0', 'EDAY1': 2, 'EDAY2': -1, 'EDAY3': -1}, {'E1': 'F', 'E2': 'A', 'E3': 'D', 'EDAY1': 5, 'EDAY2': 5, 'EDAY3': 2}]
df = pd.DataFrame(e)
display(df)

Выход:

    E1  E2  E3  EDAY1   EDAY2   EDAY3
0   A   B   C   0       1       2
1   B   0   0   2      -1      -1
2   F   A   D   5       5       2

Где E1 - E3 - события, а EDAY1 - EDAY3 -дни, когда произошли соответствующие события.Обратите внимание:

  • Если событие не произошло, оно помечается как '0', а соответствующему EDAY присваивается значение -1
  • Событие E1 имеет больший приоритет, чемE2 и E2 чем E3
  • Приоритет события не соответствует EDAY (см. Последний ряд)
  • Некоторые события произошли в один и тот же день

Я хотел бы превратить эти события в строки длиной 10 символов на основе следующих критериев:

  1. Каждая позиция символа в строке приблизительно соответствует дню, когда произошло событие
  2. Дни, когда не было никаких событий, будут представлены символом '0'
  3. События, которые произошли в один и тот же день, будут отсортированы по уровню приоритета и установлены непосредственно рядом друг с другом (я понимаю, что этоне идеальное представление, но пока оно подойдет)

Поэтому, учитывая приведенный выше пример, я хотел бы получить следующее представление:

    E1  E2  E3  EDAY1   EDAY2   EDAY3   E_STR
0   A   B   C   0       1       2       ABC0000000
1   B   0   0   2      -1      -1       00B0000000
2   F   A   D   5       5       2       00D00FA000

Обратите внимание, что этоне домашняя работа, но я новичок в Python и Pandas, и это поставило меня в тупик.

1 Ответ

0 голосов
/ 13 декабря 2018

Просто поделитесь своим подходом к этому вопросу, я использовал wide_to_long, чтобы сгладить исходный кадр данных, затем исключить -1 и zip все значения в list из list, плохая структура, но не беспокойтесьнам просто нужно создать пару значений и позицию (в моем понимании EDAY - это позиция символа в E)

newdf=pd.wide_to_long(df.reset_index(),['E','EDAY'],i='index',j='drop').loc[lambda x : x.EDAY!=-1]
newdf.EDAY+=newdf.groupby(['index','EDAY']).cumcount()# here is to protect when two position show up same time
newdf=newdf.groupby(level=0).agg(list)

После того, как мы изменили форму, мы используем цикл for для создания выбранного вами символа.нужно

l=[]
for x ,y in zip(newdf.E,newdf.EDAY):
    xvar=list('0000000000')
    for idx,z in enumerate(y):
        xvar[z]=x[idx]
    l.append(''.join(xvar))
l
Out[111]: ['ABC0000000', '00B0000000', '00D00FA000']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...