эффективное решение для преобразования данных в pandas - PullRequest
1 голос
/ 29 апреля 2020

У меня есть такой фрейм данных, как

id col1 col2 col3 ......col25
1 a b c d ...........
2 d e f NA ........
3 a NA NA NA .......

То, что я хочу:

id start end
1 a b
1 b c
1 c d
2 d e
2 e f

for names, row in data_final.iterrows():
    for i in range(0,26):
        try:
            x = pd.Series([row["id"],row[i], row[i+1]],index=['id', 'start','end'])
            df1 = df1.append(x, ignore_index = True)
        except:
            break

Это работает, но это определенно не лучшее решение, поскольку его временная сложность слишком высока. Мне нужно лучшее и эффективное решение для этого.

1 Ответ

1 голос
/ 29 апреля 2020

Одним из способов может быть stack для удаления пропущенных значений, groupby и zip для агрегирования каждого элемента с последующим. Нам просто нужно сгладить результат с помощью itertools.chain и создать фрейм данных:

from itertools import chain
l = [list(zip(v.values[:-1], v.values[1:])) for _,v in df.stack().groupby(level=0)]
pd.DataFrame(chain.from_iterable(l), columns=['start', 'end'])

  start end
0     a   b
1     b   c
2     c   d
3     d   e
4     e   f
...