108

pandas DataFrameに、1つのスペースで分割したい列があります。分割は簡単です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]、1つのリストエントリの配列を与えるだけでtemp2[:][-1]失敗します。各配列の最後のエントリを新しい列に変換するにはどうすればよいですか?ありがとう!

4

5 に答える 5

206

これを行う:

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

したがって、すべて一緒にすると、次のようになります。

>>> 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 に答える