Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to split index into multi-index with non-delimiter pandas

I have this data frame:

   index         0
idxaa1cx1    some_text
idxbb2cx2    some_text
idxcc3cx3    some_text

I want to split the index into a multi index like so:

  idx_1      idx_2        0
  idxa      a1cx1      some_text
  idxb      b2cx2      some_text
  idxc      c3cx3      some_text

I've tried this:

df.index = pd.MultiIndex.from_tuples([tuple(idx.split(idx[:3][-5:])) for idx in df.index])

which returns:

idx_1    idx_2        0
          a1cx1      some_text
          b2cx2      some_text
          c3cx3      some_text

but the idx_1 column is blank. And I've also tried:

df.index = pd.MultiIndex.from_tuples([tuple({idx[:3]:idx[-5:]}) for idx in df.index])

which only returns:

idx_1        0
idxa      some_text
idxb      some_text
idxc      some_text

and doesn't return the dictionary's "value". My question is how can I split the index by an arbitrary length and get multiple columns?

like image 320
e9e9s Avatar asked Dec 14 '22 23:12

e9e9s


2 Answers

You can use pd.MultiIndex.from_arrays:

df.index = pd.MultiIndex.from_arrays([df.index.str[:4], df.index.str[-5:]])
df.rename_axis(("idx_1", "idx_2"))

enter image description here

like image 192
Psidom Avatar answered Dec 16 '22 14:12

Psidom


The minimalist approach

df.index = [df.index.str[:4], df.index.str[-5:]]
df

                     0
index index           
idxa  a1cx1  some_text
idxb  b2cx2  some_text
idxc  c3cx3  some_text
like image 34
piRSquared Avatar answered Dec 16 '22 14:12

piRSquared