108

我在 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]失败。如何将每个数组中的最后一个条目转换为新列?谢谢!

4

5 回答 5

206

Do this:

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

So all together it would be:

>>> temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
>>> temp['ticker'].str.split(' ').str[-1]
0    p500
1    p600
2    p700
Name: ticker, dtype: object
于 2012-10-24T16:13:48.523 回答
47

您可以使用该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
于 2012-09-20T01:43:43.317 回答
29

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]
于 2017-07-07T17:52:33.223 回答
6

使用熊猫 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
于 2017-11-13T17:12:15.873 回答
5

如果您正在寻找单线(就像我来这里),这应该很好:

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

您还可以简单地修改此答案以将此列分配回原始 DataFrame,如下所示:

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

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

于 2019-09-25T14:22:22.743 回答