web-dev-qa-db-fra.com

Combinaison de deux séries dans un DataFrame dans pandas

J'ai deux séries s1 et s2 avec les mêmes indices (non consécutifs). Comment combiner s1 et s2 pour constituer deux colonnes dans un DataFrame et conserver l'un des index dans une troisième colonne?

228
user7289

Je pense que concat est une bonne façon de faire cela. 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.

346
Andy Hayden

Les pandas vont automatiquement aligner ceux passés en série et créer un index commun. Ils se trouvent être les mêmes ici. reset_index déplace l'index dans 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
31
Jeff

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())
24
swmfg

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})

Les pandas vous permettent de créer une DataFrame à partir d'un dict avec Series comme valeurs et le nom des colonnes comme clés. Lorsqu'il trouve une valeur Series, il utilise l'index Series dans le cadre de l'index DataFrame. Cet alignement des données est l’un des principaux avantages des pandas. Par conséquent, à moins que vous n'ayez d'autres besoins, le DataFrame fraîchement créé a une valeur dupliquée. Dans l'exemple ci-dessus, data['idx_col'] a les mêmes données que data.index.

13
jbn

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.index n'est même pas nécessaire ici)

5
Bertrand L

Si je peux répondre à cela.

La conversion des séries en trames de données nécessite 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é mappé sur une série.

Si vous gardez à l'esprit les deux concepts précédents, vous pouvez envisager de nombreuses manières de convertir des séries en trames 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éer un bloc de données vide avec les noms de colonne désirés

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

Placez la valeur de la série dans le cadre de données à l'aide du concept de mappage

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Vérifier les résultats maintenant

df.head(5)
5
Sateesh

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

df = a.to_frame().join(b)
3
Lorenzo A. Rossi