在pandas DataFrame中的列上的.str.split()操作之后获取最后一个“列”

时间:2012-09-20 01:24:58

标签: python string pandas split

我在pandas DataFrame中有一个列,我想在一个空格上拆分。使用DataFrame.str.split(' ')进行拆分非常简单,但我无法从最后一个条目创建新列。当我.str.split()列时,我得到了一个数组列表,我不知道如何操作它来为我的DataFrame获取一个新列。

这是一个例子。该列中的每个条目都包含“符号数据价格”,我想拆分价格(最终在一半的情况下删除“p”......或“c”)。

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(' ')

产生

0    ['spx', '5/25/2001', 'p500']
1    ['spx', '5/25/2001', 'p600']
2    ['spx', '5/25/2001', 'p700']

temp2[0]只提供一个列表条目的数组,temp2[:][-1]失败。如何将每个数组中的最后一个条目转换为新列?谢谢!

5 个答案:

答案 0 :(得分:85)

这样做:

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

答案 1 :(得分:32)

您可以使用tolist方法作为中间人:

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']]

您可以从中创建新的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

为了更好的衡量,您可以确定价格:

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:但如果真的只想要最后一列,apply就足够了:

In [113]: temp2.apply(lambda x: x[2])
Out[113]: 
0    p500
1    p600
2    p700
Name: ticker

答案 2 :(得分:13)

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)

s2.str.split('_').str[1]

答案 3 :(得分:1)

使用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

答案 4 :(得分:0)

如果您正在寻找单线飞机(就像我来这里一样),这应该做得很好:

temp2 = temp.ticker.str.split(' ', expand = True)[-1]

您还可以按如下方式修改此答案,以将该列分配回原始DataFrame:

temp['last_split'] = temp.ticker.str.split(' ', expand = True)[-1]

我想这是这里的一个流行用例。