разложить (взорвать) несколько списков 2.0

Фон

Следующий код изменен отсюда способ разложить (взорвать) несколько столбцов списка в кадре данных pandas

Я создаю фреймворк данных

import pandas as pd
df = pd.DataFrame({'App': ['x1','x2','x3', 'x4'], 'Ban':['v1','v2','v3','v4'], 'C':[['c2'],['c3','c4'],['c5','c6'],['c7','c8']],'D':[['d1','d2'],['d3','d4'],['d5','d6'],['d7','d8']], 'E':[['e1','e2'],['e3','e4'],['e5','e6'],['e7','e8']]})
df

который выглядит следующим образом

   App Ban    C             D         E
0   x1  v1  [c2]        [d1, d2]    [e1, e2]
1   x2  v2  [c3, c4]    [d3, d4]    [e3, e4]
2   x3  v3  [c5, c6]    [d5, d6]    [e5, e6]
3   x4  v4  [c7, c8]    [d7, d8]    [e7, e8]

Затем я использую следующий код

(df.set_index('Ban')
              .apply(lambda x: x.apply(pd.Series).stack())
              .reset_index()
              .drop('level_1', 1))

Что создает следующее

    Ban App C   D   E
0   v1  x1  c2  d1  e1
1   v1  NaN NaN d2  e2
2   v2  x2  c3  d3  e3
3   v2  NaN c4  d4  e4
4   v3  x3  c5  d5  e5
5   v3  NaN c6  d6  e6
6   v4  x4  c7  d7  e7
7   v4  NaN c8  d8  e8

Желаемый результат

Это близко к тому, что я хочу. Но мой желаемый результат таков (без NaN, но вместо этого с соответствующим именем App и C:

    Ban App C   D   E
0   v1  x1  c2  d1  e1
1   v1  x1  c2  d2  e2
2   v2  x2  c3  d3  e3
3   v2  x2  c4  d4  e4
4   v3  x3  c5  d5  e5
5   v3  x3  c6  d6  e6
6   v4  x4  c7  d7  e7
7   v4  x4  c8  d8  e8

Вопрос

Как мне получить желаемый результат?


person SFC    schedule 01.06.2019    source источник


Ответы (1)


Просто исправьте вывод, добавив ffill

df.set_index('Ban').apply(lambda x: x.apply(pd.Series).stack()).groupby(level=0).ffill().reset_index(drop=True)
Out[794]: 
  Ban App   C   D   E
0  v1  x1  c2  d1  e1
1  v1  x1  c2  d2  e2
2  v2  x2  c3  d3  e3
3  v2  x2  c4  d4  e4
4  v3  x3  c5  d5  e5
5  v3  x3  c6  d6  e6
6  v4  x4  c7  d7  e7
7  v4  x4  c8  d8  e8
person BENY    schedule 01.06.2019
comment
используя ваш код, я не получаю ваш вывод. Я получаю ваш вывод, кроме столбца Ban - person SFC; 02.06.2019
comment
@ER_18 ты вернул его? - person BENY; 02.06.2019
comment
что вы имеете в виду, говоря о том, чтобы вернуть его обратно? Я не уверен. Я просто скопировал и вставил ваш код - person SFC; 02.06.2019
comment
@ER_18 df=df.set_index('Запрет').apply(lambda x: x.apply(pd.Series).stack()).groupby(level=0).ffill().reset_index(drop=True) - person BENY; 02.06.2019
comment
Я копирую и вставляю ваш код, но столбец ban все еще не отображается - person SFC; 02.06.2019
comment
@ER_18, тогда просто reset_index без drop=True - person BENY; 02.06.2019
comment
@ER_18 нравится df.set_index('Ban').apply(lambda x: x.apply(pd.Series).stack()).ffill().reset_index().drop('level_1', 1) - person BENY; 02.06.2019