0

I would like to shift the dimension of a dataset below:

Data

location    range   status  type    Q1 28   Q2 28
NY          Low     Re      AA      2       0
NY          Low     Gr      AA      2       2
NY          Low     Re      BB      0       0
NY          Low     Gr      BB      0       0
NY          Low     Re      DD      0       2
NY          Low     Gr      DD      2       2
NY          Low     Re      SS      0       0
NY          Low     Gr      SS      0       0
CA          Med     Re      AA      0       4
CA          Med     Gr      AA      2       0
CA          Med     Re      BB      0       2
CA          Med     Gr      BB      0       0
CA          Med     Re      DD      0       6
CA          Med     Gr      DD      2       0
CA          Med     Re      SS      0       2
CA          Med     Gr      SS      0       0
                
                

Desired

location    range status type   quarter count
NY          Low   Re     AA     Q1 28   2
NY          Low   Gr     AA     Q1 28   2
NY          Low   Re     BB     Q1 28   0
NY          Low   Gr     BB     Q1 28   0
NY          Low   Re     DD     Q1 28   0
NY          Low   Gr     DD     Q1 28   2
NY          Low   Re     SS     Q1 28   0
NY          Low   Gr     SS     Q1 28   0
CA          Med   Re     AA     Q1 28   0
CA          Med   Gr     AA     Q1 28   2
CA          Med   Re     BB     Q1 28   0
CA          Med   Gr     BB     Q1 28   0
CA          Med   Re     DD     Q1 28   0
CA          Med   Gr     DD     Q1 28   2
CA          Med   Re     SS     Q1 28   0
CA          Med   Gr     SS     Q1 28   0
NY          Low   Re     AA     Q2 28   0
NY          Low   Gr     AA     Q2 28   2
NY          Low   Re     BB     Q2 28   0
NY          Low   Gr     BB     Q2 28   0
NY          Low   Re     DD     Q2 28   2
NY          Low   Gr     DD     Q2 28   2
NY          Low   Re     SS     Q2 28   0
NY          Low   Gr     SS     Q2 28   0
CA          Med   Re     AA     Q2 28   4
CA          Med   Gr     AA     Q2 28   0
CA          Med   Re     BB     Q2 28   2
CA          Med   Gr     BB     Q2 28   0
CA          Med   Re     DD     Q2 28   6
CA          Med   Gr     DD     Q2 28   0
CA          Med   Re     SS     Q2 28   2
CA          Med   Gr     SS     Q2 28   0  

Doing

df = pd.melt(df, id_vars=['location', 'range'], var_name='quarter', value_name='count')

however not all of the data is pivoting. Any suggestion is helpful.

Lynn
  • 4,292
  • 5
  • 21
  • 44

1 Answers1

1

You need specify all columns in id_vars parameter which need not melting:

df = pd.melt(df, id_vars=['location', 'range','status','type'], 
                 var_name='quarter', 
                 value_name='count')

Or dynamic get all columns not starting by Q:

cols = [c for c in df.columns if not c.startswith('Q')]  
df = pd.melt(df, id_vars=cols, var_name='quarter', value_name='count')

Or get all columns if not pattern Q + number + space + number(s):

cols = df.columns[~df.columns.str.contains(r'^Q\d\s+\d+$')].tolist()
df = pd.melt(df, id_vars=cols, var_name='quarter', value_name='count')
print (df)

   location range status type quarter  count
0        NY   Low     Re   AA   Q1 28      2
1        NY   Low     Gr   AA   Q1 28      2
2        NY   Low     Re   BB   Q1 28      0
3        NY   Low     Gr   BB   Q1 28      0
4        NY   Low     Re   DD   Q1 28      0
5        NY   Low     Gr   DD   Q1 28      2
6        NY   Low     Re   SS   Q1 28      0
7        NY   Low     Gr   SS   Q1 28      0
8        CA   Med     Re   AA   Q1 28      0
9        CA   Med     Gr   AA   Q1 28      2
10       CA   Med     Re   BB   Q1 28      0
11       CA   Med     Gr   BB   Q1 28      0
12       CA   Med     Re   DD   Q1 28      0
...
27       CA   Med     Gr   BB   Q2 28      0
28       CA   Med     Re   DD   Q2 28      6
29       CA   Med     Gr   DD   Q2 28      0
30       CA   Med     Re   SS   Q2 28      2
31       CA   Med     Gr   SS   Q2 28      0
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252