Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Shift only certain column right in dataframe, without overwritting existing columns

I have this little issue I cannot get my head around. I have imported a rather messy csv which I initially created by converting a pdf to the said csv. Now, after some housekeeping (e.g. removing some rows containing unwanted string), I am left with a df that looks ALMOST ok.

Unnamed: 0 Benämning     Unnamed: 2   id      col1       col2       col3  \
0           1     item1  2090006400001  NaN  1 706,92  68 154,93  -2 730,37   
1           2     item2  2386135200002  NaN    789,38  31 520,02     554,14   
2           3     item3  7311041052112    C  1 935,00  29 495,95   9 015,04   
3           4     item4  7311041072226    C    778,00  27 207,10     915,71   
4           5     item5  2090213700000    C  1 189,70  24 888,11   9 450,73   

   col4   col5      col6       col7       col8   Col9   Col10     Col11  \
0   NaN  -4,49  1 706,92  68 154,93  -2 730,37  -4,49  243,85  9 736,42   
1   NaN   1,97    789,38  31 520,02     554,14   1,97  112,77  4 502,86   
2   NaN  34,23      0,00       0,00       0,00   0,00  276,43  4 213,71   
3   NaN   3,77    775,00  27 072,25     885,46   3,66  111,14  3 886,73   
4   NaN  42,53  1 189,37  24 881,63   9 449,00  42,53  169,96  3 555,44   

      col12  
0   -390,05  
1     79,16  
2  1 287,86  
3    130,82  
4  1 350,10 

The only problem is that the columns ['Unnamed: 2','id','col1','col2','col3'] need to be shifted 1 step to the right. That is, the content of column ´´´Unnamed: 2should be in columnid, idinCol1“` and so on. But, these are the only columns that need to be shifted. Everything else is fine.

DF = DF.shift(axis=1) shifts all columns right and thus not only missplaces columns that originally were positioned where they should but also overwrites the last columns.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Is there a method to do this nicely without having to split the dataframe, do the shifting and then reassemble it?

Thankful for any insight.

Data: I provide a dict if anyone wants to try a solution:

{'Unnamed: 0': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
 'Benämning': {0: 'item1', 1: 'item2', 2: 'item3', 3: 'item4', 4: 'item5'},
 'Unnamed: 2': {0: 2090006400001,
  1: 2386135200002,
  2: 7311041052112,
  3: 7311041072226,
  4: 2090213700000},
 'id': {0: nan, 1: nan, 2: 'C', 3: 'C', 4: 'C'},
 'col1': {0: '1 706,92',
  1: '789,38',
  2: '1 935,00',
  3: '778,00',
  4: '1 189,70'},
 'col2': {0: '68 154,93',
  1: '31 520,02',
  2: '29 495,95',
  3: '27 207,10',
  4: '24 888,11'},
 'col3': {0: '-2 730,37',
  1: '554,14',
  2: '9 015,04',
  3: '915,71',
  4: '9 450,73'},
 'col4': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan},
 'col5': {0: '-4,49', 1: '1,97', 2: '34,23', 3: '3,77', 4: '42,53'},
 'col6': {0: '1 706,92', 1: '789,38', 2: '0,00', 3: '775,00', 4: '1 189,37'},
 'col7': {0: '68 154,93',
  1: '31 520,02',
  2: '0,00',
  3: '27 072,25',
  4: '24 881,63'},
 'col8': {0: '-2 730,37', 1: '554,14', 2: '0,00', 3: '885,46', 4: '9 449,00'},
 'Col9': {0: '-4,49', 1: '1,97', 2: '0,00', 3: '3,66', 4: '42,53'},
 'Col10': {0: '243,85', 1: '112,77', 2: '276,43', 3: '111,14', 4: '169,96'},
 'Col11': {0: '9 736,42',
  1: '4 502,86',
  2: '4 213,71',
  3: '3 886,73',
  4: '3 555,44'},
 'col12': {0: '-390,05',
  1: '79,16',
  2: '1 287,86',
  3: '130,82',
  4: '1 350,10'}}

>Solution :

You can copy the columns and drop the ‘Unnamed’ one:

df[['id', 'col1', 'col2', 'col3', 'col4']] = df[['Unnamed: 2', 'id', 'col1', 'col2', 'col3']]
print(df.drop(columns='Unnamed: 2'))

if you don’t want to worry about selecting the columns, use loc for automatic column alignment, but this will be slightly less efficient (need to shift all columns):

df.loc[:, ['id', 'col1', 'col2', 'col3', 'col4']] = df.shift(axis=1)
print(df.drop(columns='Unnamed: 2'))

output:

   Unnamed: 0 Benämning             id col1      col2       col3       col4  \
0           1     item1  2090006400001  NaN  1 706,92  68 154,93  -2 730,37   
1           2     item2  2386135200002  NaN    789,38  31 520,02     554,14   
2           3     item3  7311041052112    C  1 935,00  29 495,95   9 015,04   
3           4     item4  7311041072226    C    778,00  27 207,10     915,71   
4           5     item5  2090213700000    C  1 189,70  24 888,11   9 450,73   

    col5      col6       col7       col8   Col9   Col10     Col11     col12  
0  -4,49  1 706,92  68 154,93  -2 730,37  -4,49  243,85  9 736,42   -390,05  
1   1,97    789,38  31 520,02     554,14   1,97  112,77  4 502,86     79,16  
2  34,23      0,00       0,00       0,00   0,00  276,43  4 213,71  1 287,86  
3   3,77    775,00  27 072,25     885,46   3,66  111,14  3 886,73    130,82  
4  42,53  1 189,37  24 881,63   9 449,00  42,53  169,96  3 555,44  1 350,10  
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading