title: How to create pandas dataframes with more than 2 dimensions?
body: <p><strong>I want to be able to create <code>n-dimensional</code> dataframes.</strong>  I've heard of a method for 3D dataframes using <code>panels</code> in <code>pandas</code> but, if possible, I would like to extend the dimensions past 3 dims by combining different datasets into a <em>super dataframe</em></p>
  
  <p>I tried this but I cannot figure out how to use these methods with my test dataset -> 
  <a href="https://stackoverflow.com/questions/24290495/constructing-3d-pandas-dataframe">Constructing 3D Pandas DataFrame</a></p>
  
  <p>Also, this did not help for my case -> <a href="https://stackoverflow.com/questions/23478297/pandas-dataframe-or-panel-to-3d-numpy-array">Pandas Dataframe or Panel to 3d numpy array</a></p>
  
  <p>I made a random test dataset with arbitrary axis data trying to mimic a real situation; there are 3 axis (i.e. patients, years, and samples).  I tried adding a bunch of dataframes to a list and then making a dataframe with that but it didn't work :(  I even tried a <code>panel</code> as in the 2nd link above but I couldn't get it to work either.</p>
  
  <p><strong>Does anybody know how to create a N-dimensional pandas dataframe w/ labels?</strong></p>
  
  <p>The first way I tried: </p>
  
  <pre><code>#Reproducibility
  np.random.seed(1618033)
  
  #Set 3 axis labels/dims
  axis_1 = np.arange(2000,2010) #Years
  axis_2 = np.arange(0,20) #Samples
  axis_3 = np.array(["patient_%d" % i for i in range(0,3)]) #Patients
  
  #Create random 3D array to simulate data from dims above
  A_3D = np.random.random((years.size, samples.size, len(patients))) #(10, 20, 3)
  
  #Create empty list to store 2D dataframes (axis_2=rows, axis_3=columns) along axis_1
  list_of_dataframes=[]
  
  #Iterate through all of the year indices
  for i in range(axis_1.size):
      #Create dataframe of (samples, patients)
      DF_slice = pd.DataFrame(A_3D[i,:,:],index=axis_2,columns=axis_3)
      list_of_dataframes.append(DF_slice)
  #     print(DF_slice) #preview of the 2D dataframes "slice" of the 3D array
  #           patient_0  patient_1  patient_2
  #      0    0.727753   0.154701   0.205916
  #      1    0.796355   0.597207   0.897153
  #      2    0.603955   0.469707   0.580368
  #      3    0.365432   0.852758   0.293725
  #      4    0.906906   0.355509   0.994513
  #      5    0.576911   0.336848   0.265967
  #     ...
  #     19   0.583495   0.400417   0.020099
  
  # DF_3D = pd.DataFrame(list_of_dataframes,index=axis_2, columns=axis_1)
  # Error
  # Shape of passed values is (1, 10), indices imply (10, 20)
  </code></pre>
  
  <p>2nd way I tried:</p>
  
  <pre><code>DF = pd.DataFrame(axis_3,columns=axis_2) 
  #Error:
  #Shape of passed values is (1, 3), indices imply (20, 3)
  
  # p={}
  # for i in axis_1:
  #     p[i]=DF
  # panel= pd.Panel(p)
  </code></pre>
  
  <p>I could do something like this I guess, but I really like <code>pandas</code> and would rather use one of their methods if one exists:</p>
  
  <pre><code>#Set data for query
  query_year = 2007
  query_sample = 15
  query_patient = "patient_1"
  
  #Index based on query
  A_3D[
       (axis_1 == query_year).argmax(),
       (axis_2 == query_sample).argmax(),
       (axis_3 == query_patient).argmax()
  ]
  #0.1231212416981845
  </code></pre>
  
  <p>It would be awesome to access the data in this way: </p>
  
  <pre><code>DF_3D[query_year][query_sample][query_patient]
  #Where DF_3D[query_year] would give a list of 2D arrays (row=sample, col=patient)
  # DF_3D[query_year][query_sample] would give a 1D vector/list of patient data for a particular year, of a particular sample.
  # and DF_3D[query_year][query_sample][query_patient] would be a particular sample of a particular patient of a particular year
  </code></pre>