<질문>
팬더 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]
내가 상상하는 것은 여기에서 인기 있는 사용 사례입니다.
'개발 > Python' 카테고리의 다른 글
[파이썬] Selenium을 사용하여 텍스트 상자(입력)에서 값을 찾고 삽입하는 방법? (0) | 2022.10.11 |
---|---|
[파이썬] Django의 urls.py에서 템플릿으로 바로 이동하는 법? (0) | 2022.10.10 |
[파이썬] Matplotlib에서 그리드 간격 변경 및 눈금 레이블 지정 (0) | 2022.10.10 |
[파이썬] S3에서 파일을 다운로드할 때 AWS Lambda의 "Read-only file system" 오류 (0) | 2022.10.10 |