pandas.wide_to_long
-
pandas.wide_to_long(df, stubnames, i, j, sep='', suffix='\\d+')[source] -
Преобразование широких данных в длинный формат. Менее гибкий, но более удобный для пользователя, чем melt.
При наличии столбцов-метки [‘A’, ‘B’], эта функция ожидает найти один или несколько наборов столбцов с форматом A-приставка1, A-приставка2,…, B-приставка1, B-приставка2,… Вы указываете, как вы хотите назвать эту приставку в результирующем длинном формате с помощью
j(например,j=’year’)Ожидается, что каждая строка этих широких переменных будет однозначно идентифицироваться
i(это может быть имя одного столбца или список имён столбцов)Все остальные переменные в таблице остаются неизменными.
Параметры: -
df : DataFrame -
Таблица данных в широком формате.
-
stubnames : str or list-like -
Имя(на) метки(меток). Предполагается, что переменные в широком формате начинаются с имени(имён) метки(меток).
-
i : str or list-like -
Столбец(столбцы) для использования в качестве идентификатора(идентификаторов).
-
j : str -
Имя переменной поднаблюдения. Как вы хотите назвать вашу приставку в длинном формате.
-
sep : str, default “” -
Символ, указывающий на разделитель имён переменных в широком формате, который будет удалён из имён в длинном формате. Например, если ваши имена столбцов — A-приставка1, A-приставка2, вы можете удалить дефис, указав
sep=’-‘Введено в версии 0.20.0.
-
suffix : str, default ‘\d+’ -
Регулярное выражение, определяющее нужные приставки. ‘\d+’ определяет числовые приставки. Приставки без чисел можно определить с помощью отрицательного класса символов ‘\D+’. Вы также можете дополнительно уточнить приставки, например, если ваши широкие переменные имеют вид A-один, B-два,.., и у вас есть не связанный столбец A-оценка, вы можете игнорировать последний, указав
suffix=’(!?one|two)’Введено в версии 0.20.0.
Изменено в версии 0.23.0: Когда все приставки являются числовыми, они преобразуются в int64/float64.
Возвращаемое значение: - DataFrame
-
Таблица данных, содержащая каждое имя метки в качестве переменной с новым индексом (i, j)
Примечания
Все дополнительные переменные остаются без изменений. Это просто использует
pandas.meltпод капотом, но жестко закодировано для выполнения правильных действий в типичном случае.Примеры
>>> 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") ... # doctest: +NORMALIZE_WHITESPACE 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 ... # doctest: +NORMALIZE_WHITESPACE 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.unstack() >>> w.columns = w.columns.map('{0[0]}{0[1]}'.format) >>> 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 # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS 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='-') ... # doctest: +NORMALIZE_WHITESPACE 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Если у нас много столбцов, мы также можем использовать регулярное выражение для поиска наших имён меток и передать этот список в 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)']
Во всех приведенных выше примерах в качестве приставок используются целые числа. Возможны приставки, не являющиеся целыми числами.
>>> df = pd.DataFrame({ ... 'famid': [1, 1, 1, 2, 2, 2, 3, 3, 3], ... 'birth': [1, 2, 3, 1, 2, 3, 1, 2, 3], ... 'ht_one': [2.8, 2.9, 2.2, 2, 1.8, 1.9, 2.2, 2.3, 2.1], ... 'ht_two': [3.4, 3.8, 2.9, 3.2, 2.8, 2.4, 3.3, 3.4, 2.9] ... }) >>> df birth famid ht_one ht_two 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', sep='_', suffix='\w') >>> l ... # doctest: +NORMALIZE_WHITESPACE ht famid birth age 1 1 one 2.8 two 3.4 2 one 2.9 two 3.8 3 one 2.2 two 2.9 2 1 one 2.0 two 3.2 2 one 1.8 two 2.8 3 one 1.9 two 2.4 3 1 one 2.2 two 3.3 2 one 2.3 two 3.4 3 one 2.1 two 2.9 -
© 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.24.2/reference/api/pandas.wide_to_long.html