Obtenir la dernière colonne " après.Str.split() de l'opération sur la colonne dans les pandas DataFrame
j'ai une colonne dans une base de données pandas que je voudrais partager sur un seul espace. La séparation est assez simple avec DataFrame.str.split(' ')
, mais je ne peux pas faire une nouvelle colonne à partir de la dernière entrée. Quand J' .str.split()
la colonne je reçois une liste de tableaux et je ne sais pas comment la manipuler pour obtenir une nouvelle colonne pour mon DataFrame.
voici un exemple. Chaque entrée dans la colonne contient symbole de données de prix' et je souhaite partager sur le prix (et éventuellement supprimer le "p"... ou "c" dans la moitié cas.)
import pandas as pd
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
temp2 = temp.ticker.str.split(' ')
ce qui donne
0 ['spx', '5/25/2001', 'p500']
1 ['spx', '5/25/2001', 'p600']
2 ['spx', '5/25/2001', 'p700']
Mais temp2[0]
donne juste le tableau d'une entrée de liste et temp2[:][-1]
échoue. Comment puis-je convertir la dernière entrée dans chaque tableau une nouvelle colonne? Merci!
4 réponses
vous pourriez utiliser le tolist
méthode en tant qu'intermédiaire:
In [99]: import pandas as pd
In [100]: d1 = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
In [101]: d1.ticker.str.split().tolist()
Out[101]:
[['spx', '5/25/2001', 'p500'],
['spx', '5/25/2001', 'p600'],
['spx', '5/25/2001', 'p700']]
à partir de laquelle vous pouvez créer une nouvelle base de données:
In [102]: d2 = pd.DataFrame(d1.ticker.str.split().tolist(),
.....: columns="symbol date price".split())
In [103]: d2
Out[103]:
symbol date price
0 spx 5/25/2001 p500
1 spx 5/25/2001 p600
2 spx 5/25/2001 p700
Pour faire bonne mesure, vous pouvez fixer le prix:
In [104]: d2["price"] = d2["price"].str.replace("p","").astype(float)
In [105]: d2
Out[105]:
symbol date price
0 spx 5/25/2001 500
1 spx 5/25/2001 600
2 spx 5/25/2001 700
PS: mais si vous vraiment veux juste la dernière colonne, apply
suffirait:
In [113]: temp2.apply(lambda x: x[2])
Out[113]:
0 p500
1 p600
2 p700
Name: ticker
Faire ceci:
In [43]: temp2.str[-1]
Out[43]:
0 p500
1 p600
2 p700
Name: ticker
https://pandas.pydata.org/pandas-docs/stable/text.html
s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
s2.str.split('_').str.get(1)
ou
s2.str.split('_').str[1]
À L'Aide De Pandas 0.20.3:
In [10]: import pandas as pd
...: temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
...:
In [11]: temp2 = temp.ticker.str.split(' ', expand=True) # the expand=True return a DataFrame
In [12]: temp2
Out[12]:
0 1 2
0 spx 5/25/2001 p500
1 spx 5/25/2001 p600
2 spx 5/25/2001 p700
In [13]: temp3 = temp.join(temp2[2])
In [14]: temp3
Out[14]:
ticker 2
0 spx 5/25/2001 p500 p500
1 spx 5/25/2001 p600 p600
2 spx 5/25/2001 p700 p700