J'ai une série Pandas sf:
email
[email protected] [1.0, 0.0, 0.0]
[email protected] [2.0, 0.0, 0.0]
[email protected] [1.0, 0.0, 0.0]
[email protected] [4.0, 0.0, 0.0]
[email protected] [1.0, 0.0, 3.0]
[email protected] [1.0, 5.0, 0.0]
Et je voudrais le transformer en DataFrame suivant:
index | email | list
_____________________________________________
0 | [email protected] | [1.0, 0.0, 0.0]
1 | [email protected] | [2.0, 0.0, 0.0]
2 | [email protected] | [1.0, 0.0, 0.0]
3 | [email protected] | [4.0, 0.0, 0.0]
4 | [email protected] | [1.0, 0.0, 3.0]
5 | [email protected] | [1.0, 5.0, 0.0]
J'ai trouvé un moyen de le faire, mais je doute que ce soit le plus efficace:
df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)
reset_index
appel .Réponses:
Plutôt que de créer 2 dfs temporaires, vous pouvez simplement les transmettre en tant que paramètres dans un dict en utilisant le constructeur DataFrame:
pd.DataFrame({'email':sf.index, 'list':sf.values})
Il existe de nombreuses façons de construire un df, voir la documentation
la source
pd.concat([sf.index, sf.values], axis=1)
to_frame () :
En commençant par la série suivante, df:
J'utilise to_frame pour convertir la série en DataFrame:
df = df.to_frame().reset_index() email 0 0 [email protected] A 1 [email protected] B 2 [email protected] C 3 [email protected] D
Il ne vous reste plus qu'à renommer le nom de la colonne et à nommer la colonne d'index:
df = df.rename(columns= {0: 'list'}) df.index.name = 'index'
Votre DataFrame est prêt pour une analyse plus approfondie.
Mise à jour: Je viens de tomber sur ce lien où les réponses sont étonnamment similaires aux miennes ici.
la source
series_obj.to_frame()
travaux! Je produis ce type de classe<class 'pandas.core.frame.DataFrame'>
to_frame().reset_index()
plutôt que justereset_index
? Vous pourriez même faire justereset_index(name='list')
Series.reset_index
avecname
argumentSouvent, le cas d'utilisation survient où une série doit être promue en DataFrame. Mais si la série n'a pas de nom, il
reset_index
en résultera quelque chose comme,s = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A') s A a 1 b 2 c 3 dtype: int64
s.reset_index() A 0 0 a 1 1 b 2 2 c 3
Là où vous voyez le nom de la colonne est "0". Nous pouvons résoudre ce problème en spécifiant un
name
paramètre.s.reset_index(name='B') A B 0 a 1 1 b 2 2 c 3
s.reset_index(name='list') A list 0 a 1 1 b 2 2 c 3
Series.to_frame
Si vous souhaitez créer un DataFrame sans promouvoir l'index dans une colonne, utilisez
Series.to_frame
, comme suggéré dans cette réponse . Cela prend également en charge un paramètre de nom.s.to_frame(name='B') B A a 1 b 2 c 3
pd.DataFrame
ConstructeurVous pouvez également faire la même chose qu'en
Series.to_frame
spécifiant uncolumns
paramètre:pd.DataFrame(s, columns=['B']) B A a 1 b 2 c 3
la source
to_frame
place dereset_index
, mais y a-t-il jamais une bonne raison d'utiliser les deux? icito_frame
ne semble pas avoir d'argument pour faire cela. Merci.La réponse en une ligne serait
myseries.to_frame(name='my_column_name')
Ou
myseries.reset_index(drop=True, inplace=True) # As needed
la source
Series.to_frame
peut être utilisé pour convertir unSeries
enDataFrame
.# The provided name (columnName) will substitute the series name df = series.to_frame('columnName')
Par exemple,
s = pd.Series(["a", "b", "c"], name="vals") df = s.to_frame('newCol') print(df) newCol 0 a 1 b 2 c
la source
probablement noté comme une manière non pythonique de le faire, mais cela donnera le résultat que vous voulez dans une ligne:
Résultat:
email list 0 [email protected] [1.0, 0.0, 0.0] 1 [email protected] [2.0, 0.0, 0.0] 2 [email protected] [1.0, 0.0, 0.0] 3 [email protected] [4.0, 0.0, 3.0] 4 [email protected] [1.0, 5.0, 0.0]
la source