Измените pandas фрейм данных, переместив определенные столбцы в строки - PullRequest
1 голос
/ 31 марта 2020

У меня есть pandas кадр данных, подобный этому:

+-------+-----+-----------------+----------------+----------------+
| name  | age | favourite_color | favourite_food | favourite_city |
+-------+-----+-----------------+----------------+----------------+
| john  |  25 | yellow          | apple          | munich         |
| james |  24 | red             | onion          | melbourne      |
+-------+-----+-----------------+----------------+----------------+

Я хочу, чтобы он выглядел так:


+-------+-----+--------------------+-----------------------------+
| name  | age | favourite category | value of favourite category |
+-------+-----+--------------------+-----------------------------+
| john  |  25 | color              | yellow                      |
| john  |  25 | food               | apple                       |
| john  |  25 | city               | munich                      |
| james |  24 | color              | red                         |
| james |  24 | food               | onion                       |
| james |  24 | city               | melbourne                   |
+-------+-----+--------------------+-----------------------------+

Я хочу взять 3 "любимых_ вещь"категории и разбить их с 3 столбцов, до 2 столбцов. Один столбец должен быть именем вещь , а другой столбец должен быть значением вещь .

При этом количество строк в таблице должно умножаться на количество категорий favourite_something (в данном случае 3x), а общие значения, такие как имя и возраст, должны просто дублироваться.

На высоком уровне мой набор данных содержит 3 наблюдения в строке для каждого человека: любимый цвет, еда и город. Я хочу изменить структуру данных таким образом, чтобы в каждой строке было только одно наблюдение.

Скажите, пожалуйста, как эта операция вызывается при обработке данных, и как проще всего это сделать в python и pandas.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

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

new_df = df.melt(id_vars= ['name', 'age'], value_vars=['favourite_color', 'favourite_food', 'favourite_city'], \
        var_name='favourite category', value_name='value of favourite category')
new_df['favourite category'] = new_df['favourite category'].replace({'favourite_':''}, regex = True)

    name    age favourite category  value of favourite category
0   john    25  color               yellow
1   james   24  color               red
2   john    25  food                apple
3   james   24  food                onion
4   john    25  city                munich
5   james   24  city                melbourne
0 голосов
/ 31 марта 2020

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

  pd.wide_to_long(df,
                  stubnames ='favourite',
                  i=['name','age'],
                  j='favourite category',
                  suffix = r'(color|food|city)',
                  sep='_').rename(columns={'favourite':'value of favourite category'}).reset_index()



    name    age favourite category  value of favourite category
0   john    25       color                 yellow
1   john    25       food                  apple
2   john    25       city                  munich
3   james   24       color                 red
4   james   24       food                  onion
5   james   24       city                  melbourne
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...