web-dev-qa-db-fra.com

Récupération de la dernière colonne après l'expérience.

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!

36
Richard Herron

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
31
DSM

Faire ceci:

In [43]: temp2.str[-1]
Out[43]: 
0    p500
1    p600
2    p700
Name: ticker
79
Wes McKinney

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]
12
James Holland

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
1
AllanLRH