J'ai une colonne dans un DataFrame Pandas que je voudrais diviser sur un seul espace. La division est assez simple avec DataFrame.str.split(' ')
, mais je ne peux pas créer de nouvelle colonne à partir de la dernière entrée. Lorsque je .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 de la colonne contient 'symbol data price' et j'aimerais scinder le prix (et éventuellement supprimer le "p" ... ou le "c" dans la moitié des 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(' ')
qui donne
0 ['spx', '5/25/2001', 'p500']
1 ['spx', '5/25/2001', 'p600']
2 ['spx', '5/25/2001', 'p700']
Mais temp2[0]
donne simplement le tableau d'une entrée de liste et temp2[:][-1]
échoue. Comment puis-je convertir la dernière entrée de chaque tableau en une nouvelle colonne? Merci!
Vous pouvez utiliser la méthode tolist
comme 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']]
A partir de laquelle vous pouvez créer un nouveau DataFrame:
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 pourriez 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 voulez 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]
Utiliser les 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