Spec-Zone.ru › pandas 0.22

pandas.wide_to_long

pandas.wide_to_long(df, stubnames, i, j, sep='', suffix='\\d+') [source]

Преобразование широкого массива данных в длинный формат. Менее гибкий, но более удобный для пользователя, чем melt.

При использовании [‘A’, ‘B’] в качестве stubnames, эта функция ожидает найти один или несколько наборов столбцов в формате Asuffix1, Asuffix2,..., Bsuffix1, Bsuffix2,... Вы указываете, как вы хотите назвать этот суффикс в результирующем длинном формате с помощью j (например, j=’year’)

Предполагается, что каждая строка этих широких переменных однозначно идентифицируется i (это может быть имя одного столбца или список имен столбцов)

Все остальные переменные в фрейме данных остаются без изменений.

Параметры:

df : DataFrame

Фрейм данных в широком формате

stubnames : str или list-like

Имя(на) stub. Предполагается, что переменные в широком формате начинаются с имен stub.

i : str или list-like

Столбец(цы) для использования в качестве переменной(ых) идентификатора(ов)

j : str

Имя переменной поднаблюдения. Как вы хотите назвать свой суффикс в длинном формате.

sep : str, по умолчанию “”

Символ, указывающий на разделение имён переменных в широком формате, который будет удалён из имён в длинном формате. Например, если имена ваших столбцов A-suffix1, A-suffix2, вы можете убрать дефис, указав sep=’-‘

Новая функция в версии 0.20.0.

suffix : str, по умолчанию ‘\d+’

Регулярное выражение, захватывающее нужные суффиксы. ‘\d+’ захватывает числовые суффиксы. Суффиксы без чисел можно указать с помощью отрицательного класса символов ‘\D+’. Вы также можете дополнительно уточнить суффиксы, например, если ваши широкие переменные имеют вид Aone, Btwo,.., а у вас есть не связанный столбец Arating, вы можете пропустить последний, указав suffix=’(!?one|two)’

Новая функция в версии 0.20.0.

Возвращает:

DataFrame

Фрейм данных, содержащий каждое имя stub в качестве переменной, с новым индексом (i, j)

Примечания

Все дополнительные переменные остаются без изменений. Это просто использует pandas.melt под капотом, но жестко запрограммировано «делать правильную вещь» в типичном случае.

Примеры

>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(123)
>>> df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"},
...                    "A1980" : {0 : "d", 1 : "e", 2 : "f"},
...                    "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7},
...                    "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1},
...                    "X"     : dict(zip(range(3), np.random.randn(3)))
...                   })
>>> df["id"] = df.index
>>> df
  A1970 A1980  B1970  B1980         X  id
0     a     d    2.5    3.2 -1.085631   0
1     b     e    1.2    1.3  0.997345   1
2     c     f    0.7    0.1  0.282978   2
>>> pd.wide_to_long(df, ["A", "B"], i="id", j="year")
... 
                X  A    B
id year
0  1970 -1.085631  a  2.5
1  1970  0.997345  b  1.2
2  1970  0.282978  c  0.7
0  1980 -1.085631  d  3.2
1  1980  0.997345  e  1.3
2  1980  0.282978  f  0.1

С несколькими столбцами идентификаторов

>>> df = pd.DataFrame({
...     'famid': [1, 1, 1, 2, 2, 2, 3, 3, 3],
...     'birth': [1, 2, 3, 1, 2, 3, 1, 2, 3],
...     'ht1': [2.8, 2.9, 2.2, 2, 1.8, 1.9, 2.2, 2.3, 2.1],
...     'ht2': [3.4, 3.8, 2.9, 3.2, 2.8, 2.4, 3.3, 3.4, 2.9]
... })
>>> df
   birth  famid  ht1  ht2
0      1      1  2.8  3.4
1      2      1  2.9  3.8
2      3      1  2.2  2.9
3      1      2  2.0  3.2
4      2      2  1.8  2.8
5      3      2  1.9  2.4
6      1      3  2.2  3.3
7      2      3  2.3  3.4
8      3      3  2.1  2.9
>>> l = pd.wide_to_long(df, stubnames='ht', i=['famid', 'birth'], j='age')
>>> l
... 
                  ht
famid birth age
1     1     1    2.8
            2    3.4
      2     1    2.9
            2    3.8
      3     1    2.2
            2    2.9
2     1     1    2.0
            2    3.2
      2     1    1.8
            2    2.8
      3     1    1.9
            2    2.4
3     1     1    2.2
            2    3.3
      2     1    2.3
            2    3.4
      3     1    2.1
            2    2.9

Переход от длинного формата обратно к широкому формату требует немного творческого использования unstack

>>> w = l.reset_index().set_index(['famid', 'birth', 'age']).unstack()
>>> w.columns = pd.Index(w.columns).str.join('')
>>> w.reset_index()
   famid  birth  ht1  ht2
0      1      1  2.8  3.4
1      1      2  2.9  3.8
2      1      3  2.2  2.9
3      2      1  2.0  3.2
4      2      2  1.8  2.8
5      2      3  1.9  2.4
6      3      1  2.2  3.3
7      3      2  2.3  3.4
8      3      3  2.1  2.9

Обрабатываются и менее удобные имена столбцов

>>> np.random.seed(0)
>>> df = pd.DataFrame({'A(quarterly)-2010': np.random.rand(3),
...                    'A(quarterly)-2011': np.random.rand(3),
...                    'B(quarterly)-2010': np.random.rand(3),
...                    'B(quarterly)-2011': np.random.rand(3),
...                    'X' : np.random.randint(3, size=3)})
>>> df['id'] = df.index
>>> df 
   A(quarterly)-2010  A(quarterly)-2011  B(quarterly)-2010  ...
0           0.548814           0.544883           0.437587  ...
1           0.715189           0.423655           0.891773  ...
2           0.602763           0.645894           0.963663  ...
   X  id
0  0   0
1  1   1
2  1   2
>>> pd.wide_to_long(df, ['A(quarterly)', 'B(quarterly)'], i='id',
...                 j='year', sep='-')
... 
         X  A(quarterly)  B(quarterly)
id year
0  2010  0      0.548814     0.437587
1  2010  1      0.715189     0.891773
2  2010  1      0.602763     0.963663
0  2011  0      0.544883     0.383442
1  2011  1      0.423655     0.791725
2  2011  1      0.645894     0.528895

Если у нас много столбцов, мы также можем использовать регулярное выражение для поиска наших stubnames и передать этот список в wide_to_long

>>> stubnames = sorted(
...     set([match[0] for match in df.columns.str.findall(
...         r'[A-B]\(.*\)').values if match != [] ])
... )
>>> list(stubnames)
['A(quarterly)', 'B(quarterly)']

© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.22.0/generated/pandas.wide_to_long.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API