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?
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.
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
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())
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
.
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)
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)
Une simplification de la solution basée sur join()
:
df = a.to_frame().join(b)