Разделить строку столбца pandas кадра данных с несколькими значениями на отдельные строки - PullRequest
1 голос
/ 10 июля 2020

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

df_input = pd.DataFrame([{'var1':'A/A1', 'var2':'x/y/z', 'var3':'abc1'}, 
                         {'var1':'B', 'var2':'xx/yy', 'var3':'abc2'}, 
                         {'var1':'c', 'var2':'zz', 'var3':'abcd'}])

   var1 var2    var3
0  A/A1 x/y/z   abc1
1   B   xx/yy   abc2
2   c   zz      abcd

Результат, который я пытаюсь получить, должен выглядеть следующим образом. Итак, для первого примера отрезки пути A to A1 then A1 to x then x to y and then y to z. Если есть способ добавить дополнительный столбец с указанием номера участка маршрута (1,2,3 и т. Д. c.), Это будет очень полезно. var3 здесь не имеет значения, но я просто включил его, чтобы показать, что есть другие столбцы, которые повторяются при разделении строк.

df_output = pd.DataFrame([{'var1': 'A', 'var2': 'A1', 'var3':'abc1'}, 
                          {'var1': 'A1', 'var2': 'x', 'var3':'abc1'},
                          {'var1': 'x', 'var2': 'y', 'var3':'abc1'},
                          {'var1': 'y', 'var2': 'z', 'var3':'abc1'},
                          {'var1': 'B', 'var2': 'xx', 'var3':'abc2'},
                          {'var1': 'xx', 'var2': 'yy', 'var3':'abc2'},
                          {'var1': 'c', 'var2': 'zz', 'var3':'abcd'}])

  var1 var2 var3
0   A   A1  abc1
1   A1  x   abc1
2   x   y   abc1
3   y   z   abc1
4   B   xx  abc2
5   xx  yy  abc2
6   c   zz  abcd

Кто-нибудь может помочь? Я разместил аналогичный (более простой) вопрос ранее, но повторная публикация, поскольку сложность увеличилась, а решение здесь не работает для сценария, где и var1, и var2 имеют несколько записей, разделенных /.

Спасибо

1 Ответ

4 голосов
/ 10 июля 2020

Вот один путь от join + explode, затем shift

df_input['New']=df_input[['var1','var2']].agg('/'.join,1).str.split('/')
df=df_input.explode('New')
df['New2']=df.groupby(level=0).New.shift(-1)
df=df.dropna(subset=['New2'],axis=0)
df
   var1   var2  var3 New New2
0  A/A1  x/y/z  abc1   A   A1
0  A/A1  x/y/z  abc1  A1    x
0  A/A1  x/y/z  abc1   x    y
0  A/A1  x/y/z  abc1   y    z
1     B  xx/yy  abc2   B   xx
1     B  xx/yy  abc2  xx   yy
2     c     zz  abcd   c   zz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...