Нужно изменить форму моего dataframe (много имен столбцов) - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь изменить форму данных в пандах. В настоящее время у меня есть одна переменная id, а остальные переменные имеют следующий формат: «variableyear», где year находится между 2000 и 2016. Я хочу создать новую переменную year (которая извлекает год из моей переменной variableyear) и создает столбец с именем переменной. Вот пример набора данных, который похож на мой реальный набор данных (так как мои данные конфиденциальны):


    |  name   | income2015 | income2016 | children2015 | children2016 | education2015 | education2016 
 ---|---------|------------|------------|--------------|--------------|---------------|--------------- 
  0 | John    |          1 |          4 |            7 |           10 |            13 |            16 
  1 | Phillip |          2 |          5 |            8 |           11 |            14 |            17 
  2 | Carl    |          3 |          6 |            9 |           12 |            15 |            18 

Вот что я хочу:

    |  name   | year | income | children | education 
 ---|---------|------|--------|----------|----------- 
  0 | John    | 2015 |      1 |        7 |        13 
  1 | Phillip | 2015 |      2 |        8 |        14 
  2 | Carl    | 2015 |      3 |        9 |        15 
  3 | John    | 2016 |      4 |       10 |        16 
  4 | Phillip | 2016 |      5 |       11 |        17 
  5 | Carl    | 2016 |      6 |       12 |        18 

Я уже пробовал следующее:

df2 = pd.melt(df, id_vars=['name'], value_vars=df.columns[1:])
df2['year'] = df2['variable'].map(lambda x: x[-4:])
df2['variable'] = df2['variable'].map(lambda x: x[:-4])

, что дает мне это:

       |          |           |      |      
 ------|----------|-----------|------|------ 
  name | variable | value     | year |      
  0    | John     | income    | 1    | 2015 
  1    | Phillip  | income    | 2    | 2015 
  2    | Carl     | income    | 3    | 2015 
  3    | John     | income    | 4    | 2016 
  4    | Phillip  | income    | 5    | 2016 
  5    | Carl     | income    | 6    | 2016 
  6    | John     | children  | 7    | 2015 
  7    | Phillip  | children  | 8    | 2015 
  8    | Carl     | children  | 9    | 2015 
  9    | John     | children  | 10   | 2016 
  10   | Phillip  | children  | 11   | 2016 
  11   | Carl     | children  | 12   | 2016 
  12   | John     | education | 13   | 2015 
  13   | Phillip  | education | 14   | 2015 
  14   | Carl     | education | 15   | 2015 
  15   | John     | education | 16   | 2016 
  16   | Phillip  | education | 17   | 2016 
  17   | Carl     | education | 18   | 2016 

Но теперь я должен снова изменить форму ... Есть ли легче сделать это?

Также, вот мой df в формате словаря:

{'children2015': {0: 7, 1: 8, 2: 9}, 'children2016': {0: 10, 1: 11, 2: 12}, 'education2015': {0: 13, 1: 14, 2: 15}, 'education2016': {0: 16, 1: 17, 2: 18}, 'income2015': {0: 1, 1: 2, 2: 3}, 'income2016': {0: 4, 1: 5, 2: 6}, 'name': {0: 'John', 1: 'Phillip', 2: 'Carl'}}

1 Ответ

0 голосов
/ 19 января 2019

Вы действительно можете использовать pd.wide_to_long только для этого.В аргументе stubnames вы можете использовать набор имен переменных (исключая имя и пропустить последние 4 символа) в вашей df, используя этот код: set([x[:-4] for x in df.columns[1:]]).

pd.wide_to_long(df,stubnames=set([x[:-4] for x in df.columns[1:]]),i=['name'],j='year').reset_index()

Вывод:

    name    year    education   income  children
0   John    2015    13          1       7
1   Phillip 2015    14          2       8
2   Carl    2015    15          3       9
3   John    2016    16          4       10
4   Phillip 2016    17          5       11
5   Carl    2016    18          6       12
...