2017-10-09 4 views
0

Je ne suis pas habitué aux Pandas et je suis actuellement confronté à un problème lorsque j'essaie d'insérer une Dataframe dans une Dataframe. Ce que je veux faire: J'ai plusieurs simulations et fichiers de signaux correspondants et je veux tous dans un grand DataFrame. Je veux donc un DataFrame qui a tous mes paramètres de simulation et aussi mes signaux en tant que DataFrame imbriqué. Il devrait ressembler à ceci:Pandas: Stockage de données dans une structure de données

SimName | Date | Parameter 1 | Parameter 2 | Signal 1 | Signal 2 | 
Name 1 | 123 | XYZ   | XYZ   | DataFrame | DataFrame | 
Name 2 | 456 | XYZ   | XYZ   | DataFrame | DataFrame | 

Où SimName est mon index pour le grand dataframe et chaque entrée Signal 1 et Signal 2 est un dataframe individuall.

Mon idée était de mettre en œuvre ce comme ceci:

big_DataFrame['Signal 1'].loc['Name 1'] 

Mais il en résulte une ValueError:

Incompatible indexer with DataFrame

Est-il possible d'avoir cette DataFrames imbriquées dans Pandas?

Nico

+0

Vous devez montrer vos données initiales ... – IanS

+0

Qu'est-ce que vous voulez dire avec des données intitial? Pour l'instant je crée le DataFrame avec une liste de toutes les simulations comme indixies et puis j'ajoute chaque donnée de simulation après l'autre –

+0

Pourquoi voudriez-vous stocker un df dans un df? Regardez dans [panneau pandas] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Panel.html). – Parfait

Répondre

0

le docs dire que seul Series peut être dans un DataFrame. Cependant, passer DataFrames semble fonctionner aussi bien. Voici un exaple en supposant qu'aucun des colonnes est MultiIndex:

import pandas as pd 

signal_df = pd.DataFrame({'X': [1,2,3], 
          'Y': [10,20,30]} ) 

big_df = pd.DataFrame({'SimName': ['Name 1','Name 2'], 
         'Date ':[123 , 456 ], 
         'Parameter 1':['XYZ', 'XYZ'], 
         'Parameter 2':['XYZ', 'XYZ'], 
         'Signal 1':[signal_df, signal_df], 
         'Signal 2':[signal_df, signal_df]} ) 

big_df.loc[0,'Signal 1'] 
big_df.loc[0,'Signal 1'][X] 

Il en résulte:

out1: X Y 
     0 1 10 
     1 2 20 
     2 3 30 

out2: 0 1 
     1 2 
     2 3 
     Name: X, dtype: int64 

En cas dataframes imbriqués ne fonctionnent pas correctement, vous pouvez mettre en œuvre une sorte de pointeurs que vous magasin dans big_df qui vous permettra d'accéder aux données de données enregistrées ailleurs.

0

Au lieu de big_DataFrame['Signal 1'].loc['Name 1'] vous devez utiliser

big_DataFrame.loc['Name 1','Signal 1'] 
+0

Bien que cela puisse être syntaxiquement plus concis, il n'évite pas le problème. – rbinnun

0

Les 'pointeurs' visés à la fin de ns63sr's answer pourraient être mises en œuvre en tant que classe, par exemple ..

Définition:

class df_holder: 
    def __init__(self, df): 
     self.df = df 

Ensemble:

df.loc[0,'df_holder'] = df_holder(df) 

Get:

df.loc[0].df_holder.df