Pandas: création de DataFrame à partir D'une série

Mon code actuel est indiqué ci - dessous- je suis de l'importation d'un TAPIS de fichier et essayer de créer un DataFrame de variables à l'intérieur:

mat = loadmat(file_path)  # load mat-file
Variables = mat.keys()    # identify variable names

df = pd.DataFrame         # Initialise DataFrame

for name in Variables:

    B = mat[name]
    s = pd.Series (B[:,1])

donc dans la boucle je peux créer une série de chaque variable (ce sont des tableaux avec deux colonnes - donc les valeurs dont j'ai besoin sont dans la colonne 2)

ma question Est Comment puis-je ajouter la série à la base de données? J'ai parcouru la documentation et aucun des exemples ne semble correspondre à ce que j'essaie de faire.

Meilleur Cordialement,

Ben

19
demandé sur BMichell 2014-05-07 19:06:40

3 réponses

Voici comment créer une DataFrame où chaque série est une ligne.

Pour une seule Série (résultant en une seule ligne DataFrame):

series = pd.Series([1,2], index=['a','b'])
df = pd.DataFrame([series])

pour les séries multiples avec des indices identiques:

cols = ['a','b']
list_of_series = [pd.Series([1,2],index=cols), pd.Series([3,4],index=cols)]
df = pd.DataFrame(list_of_series, columns=cols)

pour les séries multiples avec éventuellement des indices différents:

list_of_series = [pd.Series([1,2],index=['a','b']), pd.Series([3,4],index=['a','c'])]
df = pd.concat(list_of_series, axis=1).transpose()

pour créer une base de données où chaque série est une colonne, voir les réponses par d'autres. Alternativement, on peut créer une base de données où chaque série est une ligne, comme ci-dessus, puis utilisez df.transpose(). Cependant, la dernière approche est inefficace si les colonnes ont des types de données différents.

20
répondu Jaan 2015-06-28 09:38:02

pas besoin d'initialiser une DataFrame vide (vous ne le faisiez même pas, vous auriez besoin de pd.DataFrame() avec les parenthèses).

au lieu de cela, pour créer une base de données où chaque série est une colonne,

  1. faire une liste de Série, series et
  2. concaténer horizontalement avec df = pd.concat(series, axis=1)

quelque Chose comme:

series = [pd.Series(mat[name][:, 1]) for name in Variables]
df = pd.concat(series, axis=1)
13
répondu TomAugspurger 2018-06-13 17:00:18

je suppose qu'une autre façon, peut-être plus rapide, d'atteindre ceci est 1) Utilisez la compréhension de dict pour obtenir le dict désiré (c.-à-d., en prenant la deuxième couleur de chaque tableau) 2) alors utilisez pd.DataFrame pour créer une instance directement à partir du dict sans boucle sur chaque col et concat.

en supposant votre mat ressemble à ceci (vous pouvez ignorer ce depuis votre mat est chargé à partir du fichier):

In [135]: mat = {'a': np.random.randint(5, size=(4,2)),
   .....: 'b': np.random.randint(5, size=(4,2))}

In [136]: mat
Out[136]: 
{'a': array([[2, 0],
        [3, 4],
        [0, 1],
        [4, 2]]), 'b': array([[1, 0],
        [1, 1],
        [1, 0],
        [2, 1]])}

Ensuite, vous pouvez faire:

In [137]: df = pd.DataFrame ({name:mat[name][:,1] for name in mat})

In [138]: df
Out[138]: 
   a  b
0  0  0
1  4  1
2  1  0
3  2  1

[4 rows x 2 columns]
2
répondu Happy001 2014-05-08 01:34:12