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!

34
demandé sur Joe Kington 2012-09-20 05:24:57

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
28
répondu DSM 2012-09-20 01:43:43

Faire ceci:

In [43]: temp2.str[-1]
Out[43]: 
0    p500
1    p600
2    p700
Name: ticker
66
répondu Wes McKinney 2012-10-24 16:13:48

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]
7
répondu James Holland 2017-07-07 17:52:33

À 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
0
répondu AllanLRH 2017-11-13 17:12:15