개발/Python

[파이썬] pandas DataFrame의 열에 대한 .str.split() 작업 후 마지막 열 가져오기

MinorMan 2022. 10. 10. 04:36
반응형

<질문>

팬더 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] 실패. 각 배열의 마지막 항목을 새 열로 어떻게 변환합니까? 감사!


<답변1>

이 작업을 수행:

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

<답변2>

당신은 사용할 수 있습니다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

추신: 하지만 만약 당신이정말 마지막 열만 원하면apply 충분할 것입니다:

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

<답변3>

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]

<답변4>

팬더 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

<답변5>

내가 여기에 온 것처럼 한 줄짜리 라이너를 찾고 있다면 다음과 같이 잘해야합니다.

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

이 답변을 간단하게 수정하여 다음과 같이 이 열을 원래 DataFrame에 다시 할당할 수도 있습니다.

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

내가 상상하는 것은 여기에서 인기 있는 사용 사례입니다.

반응형