TL; DR 버전 :
간단한 경우 :
- 구분 기호가있는 텍스트 열이 있고 두 개의 열을 원합니다
가장 간단한 해결책은 다음과 같습니다.
df['A'], df['B'] = df['AB'].str.split(' ', 1).str
또는 다음을 사용하여 분할의 각 항목에 대해 하나의 열로 DataFrame을 만들 수 있습니다.
df['AB'].str.split(' ', 1, expand=True)
expand=True
문자열에 균일하지 않은 스플릿 수가 None
있고 결 측값을 바꾸려는 경우 사용해야 합니다.
두 경우 모두 .tolist()
방법이 필요하지 않은 방법에 유의하십시오. 둘 다입니다 zip()
.
상세히:
Andy Hayden의 솔루션 은이 str.extract()
방법 의 성능을 가장 잘 보여줍니다 .
그러나 알려진 구분 기호에 대한 간단한 분할 (예 : 대시로 나누기 또는 공백으로 나누기)의 경우이 .str.split()
방법으로 충분합니다 1 . 문자열의 열 (Series)에서 작동하며 목록의 열 (Series)을 리턴합니다.
>>> import pandas as pd
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
>>> df
AB
0 A1-B1
1 A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df
AB AB_split
0 A1-B1 [A1, B1]
1 A2-B2 [A2, B2]
1 : 처음 두 매개 변수가 무엇인지 확실하지 않은 경우 일반 Python 버전의 메서드에.str.split()
대한 문서를 권장합니다 .
그러나 당신은 어떻게 출발합니까 :
에:
- 각각 목록의 각 요소를 포함하는 두 개의 열?
글쎄, 우리 .str
는 열의 속성을 자세히 살펴볼 필요가있다 .
열의 각 요소를 문자열로 취급하는 메서드를 수집 한 다음 각 요소의 각 메서드를 가능한 한 효율적으로 적용하는 데 사용되는 마법의 개체입니다.
>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})
>>> upper_lower_df
U
0 A
1 B
2 C
>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()
>>> upper_lower_df
U L
0 A a
1 B b
2 C c
그러나 색인으로 문자열의 각 요소를 가져 오는 "인덱싱"인터페이스도 있습니다.
>>> df['AB'].str[0]
0 A
1 A
Name: AB, dtype: object
>>> df['AB'].str[1]
0 1
1 2
Name: AB, dtype: object
물론이 인덱싱 인터페이스는 .str
인덱싱 할 수있는 한 인덱싱하는 각 요소가 실제로 문자열인지 여부를 실제로 신경 쓰지 않습니다.
>>> df['AB'].str.split('-', 1).str[0]
0 A1
1 A2
Name: AB, dtype: object
>>> df['AB'].str.split('-', 1).str[1]
0 B1
1 B2
Name: AB, dtype: object
그런 다음 파이썬 튜플의 iterables 압축 풀기를 활용하는 간단한 문제입니다.
>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str
>>> df
AB AB_split A B
0 A1-B1 [A1, B1] A1 B1
1 A2-B2 [A2, B2] A2 B2
물론 문자열 열을 분할하여 DataFrame을 가져 오는 것은 매개 변수 .str.split()
를 사용하여 메소드가 수행 할 수 있도록 매우 유용합니다 expand=True
.
>>> df['AB'].str.split('-', 1, expand=True)
0 1
0 A1 B1
1 A2 B2
따라서 우리가 원하는 것을 달성하는 또 다른 방법은 다음과 같습니다.
>>> df = df[['AB']]
>>> df
AB
0 A1-B1
1 A2-B2
>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
AB A B
0 A1-B1 A1 B1
1 A2-B2 A2 B2
expand=True
버전은, 비록 이상, 튜플 풀고 방법을 통해 뚜렷한 장점이 있습니다. 튜플 포장 풀기는 길이가 다른 스플릿을 잘 처리하지 못합니다.
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})
>>> df
AB
0 A1-B1
1 A2-B2
2 A3-B3-C3
>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')
Traceback (most recent call last):
[...]
ValueError: Length of values does not match length of index
>>>
그러나 "분할"이 충분하지 않은 열에 expand=True
배치하여 잘 처리합니다 None
.
>>> df.join(
... df['AB'].str.split('-', expand=True).rename(
... columns={0:'A', 1:'B', 2:'C'}
... )
... )
AB A B C
0 A1-B1 A1 B1 None
1 A2-B2 A2 B2 None
2 A3-B3-C3 A3 B3 C3
read_table()
또는read_fwf()