Combiner deux séries en un DataFrame dans les pandas

278

J'ai deux séries s1et s2avec les mêmes indices (non consécutifs). Comment puis-je combiner s1et s2devenir deux colonnes dans un DataFrame et conserver l'un des index comme troisième colonne?

user7289
la source

Réponses:

417

Je pense que concatc'est une bonne façon de le faire. S'ils sont présents, il utilise les attributs de nom de la série comme colonnes (sinon il les numérote simplement):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Remarque: Cela s'étend à plus de 2 séries.

Andy Hayden
la source
5
cela évite également la copie (par rapport à la solution dict)
Jeff
Dans un cas, il semble me dire «ValueError: La valeur de vérité d'un tableau avec plus d'un élément est ambiguë. Utilisez a.any () ou a.all () '- des idées?
user7289
@ user7289 ne savez pas d'où cela proviendrait, pourriez-vous poser cette question comme une autre question?
Andy Hayden
@AndyHayden: que faire s'il y a des doublons le long d'un ou des deux index?
Mannaggia du
2
@dafinguzman, ce que signifie "réutiliser constamment cette fonction", c'est que vous devriez préférer faire le concat une fois pd.concat([list_of_dataframes]) vs concaténer plusieurs fois new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])ou similaire.
Andy Hayden
38

Pourquoi n'utilisez-vous pas simplement .to_frame si les deux ont les mêmes index?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
la source
4
Peut-être que ce serait plus approprié: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Les pandas aligneront automatiquement ceux-ci passés en série et créeront l'index conjoint. Ils se trouvent être les mêmes ici. reset_indexdéplace l'index vers une colonne.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251
Jeff
la source
16

Exemple de code:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Pandas vous permet de créer un à DataFramepartir d'un dictavec Seriescomme valeurs et les noms de colonnes comme clés. Lorsqu'il trouve un en Seriestant que valeur, il utilise l' Seriesindex comme partie de l' DataFrameindex. Cet alignement des données est l'un des principaux avantages des Pandas. Par conséquent, à moins que vous n'ayez d'autres besoins, la nouvelle création DataFramea une valeur dupliquée. Dans l'exemple ci-dessus, data['idx_col']a les mêmes données que data.index.

jbn
la source
13

Si je peux répondre à cela.

Les principes fondamentaux de la conversion de séries en trames de données sont de comprendre que

1. Au niveau conceptuel, chaque colonne du bloc de données est une série.

2. Et, chaque nom de colonne est un nom de clé qui correspond à une série.

Si vous gardez à l'esprit deux concepts, vous pouvez penser à de nombreuses façons de convertir des séries en bloc de données. Une solution simple sera comme ceci:

Créez deux séries ici

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Créez un bloc de données vide avec juste les noms de colonnes souhaités

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Mettre la valeur de la série dans le bloc de données en utilisant le concept de mappage

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Vérifiez les résultats maintenant

df.head(5)
Sateesh
la source
6

Je ne suis pas sûr de bien comprendre votre question, mais est-ce ce que vous voulez faire?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexn'est même pas nécessaire ici)

Bertrand L
la source
3

Une simplification de la solution basée sur join():

df = a.to_frame().join(b)
Lorenzo A. Rossi
la source
1

J'ai utilisé des pandas pour convertir mon tableau ou iseries numpy en une trame de données, puis j'ai ajouté et ajouté la colonne supplémentaire par clé en tant que «prédiction». Si vous avez besoin que la trame de données soit reconvertie en liste, utilisez values.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
Lion d'or
la source