web-dev-qa-db-fra.com

Pandas: Création de DataFrame à partir de Series

Mon code actuel est présenté ci-dessous - j'importe un fichier MAT et j'essaie de créer un DataFrame à partir de variables qu'il contient:

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 de deux colonnes - les valeurs dont j'ai besoin sont donc dans la colonne 2)

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

Meilleures salutations,

Ben

30
BMichell

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

Pour une seule série (résultant en un DataFrame à une seule ligne):

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

Pour plusieurs séries d'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 plusieurs séries 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 un DataFrame où chaque série est une colonne, voir les réponses par d'autres. Vous pouvez également créer un DataFrame où chaque série est une ligne, comme ci-dessus, puis utiliser df.transpose(). Cependant, cette dernière approche est inefficace si les colonnes ont des types de données différents.

36
Jaan

Pas besoin d'initialiser un 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 un DataFrame où chaque série est une colonne,

  1. faire une liste de séries, series, et
  2. les 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)
22
TomAugspurger

Je suppose qu’une autre manière, peut-être plus rapide, d’y parvenir est 1) Utilisez la compréhension de dict pour obtenir le dict souhaité (c’est-à-dire en prenant la 2ème colonne de chaque tableau) 2) Utilisez ensuite pd.DataFrame pour créer une instance directement à partir du dict sans boucle sur chaque col et concat.

En supposant que votre mat ressemble à ceci (vous pouvez l'ignorer puisque votre mat est chargé à partir d'un 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
Happy001