source

데이터 프레임 문자열 열을 두 열로 분할하려면 어떻게 해야 합니까?

bestscript 2023. 2. 5. 09:40

데이터 프레임 문자열 열을 두 열로 분할하려면 어떻게 해야 합니까?

1개의 , 는 '열(열2개의fips' 한 쪽은요.'row'

프레임 ★★★★★★★★★★★★★★★★★★★★」df음음음같 뭇매하다

          row
0    00000 UNITED STATES
1    01000 ALABAMA
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

df.row.str[:]열 셀을 분할하는 목표를 달성했습니다.사용할 수 있습니다.df['fips'] = hello 기둥을 hello뭐각각 는???

         fips       row
0    00000 UNITED STATES
1    01000 ALABAMA 
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

TL;DR 버전:

다음과 같은 간단한 경우:

  • 구분 기호가 있는 텍스트 열이 있으며 두 개의 열이 필요합니다.

가장 간단한 해결책은 다음과 같습니다.

df[['A', 'B']] = df['AB'].str.split(' ', 1, expand=True)

하셔야 합니다.expand=True하지 않고 한 None결측값을 바꿉니다.

, 「」, 「」가 되어 있는지 해 주세요..tolist()방법은 필요 없습니다. 다 아니다zip().

상세:

Andy Hayden의 솔루션은 이 방법의 힘을 입증하는 데 가장 탁월합니다.

그러나 알려진 구분 기호(예: 대시로 분할 또는 공백으로 분할) 위에 단순 분할하는 경우에는 이 방법으로 충분합니다1.문자열 열(시리즈)에서 작동하고 다음 목록의 열(시리즈)을 반환합니다.

>>> 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의 첫 : 「 」.str.split()do, 일반 Python 버전의 메서드에 대한 문서를 추천합니다.

하지만 어떻게 하면 좋을까요?

  • 두 줄의 목록이 들어 있는 열

대상:

  • 각각 목록의 각 요소가 들어 있는 두 개의 열?

..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

그러면 Python 태플을 이용하여 반복 가능한 패키지를 풀면 됩니다.

>>> 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은 "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"CHANGE"는 다음과 같이 입력합니다.

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

더 나은 방법이 있을 수 있지만, 여기 한 가지 방법이 있습니다.

                            row
    0       00000 UNITED STATES
    1             01000 ALABAMA
    2  01001 Autauga County, AL
    3  01003 Baldwin County, AL
    4  01005 Barbour County, AL
df = pd.DataFrame(df.row.str.split(' ',1).tolist(),
                                 columns = ['fips','row'])
   fips                 row
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

regex 패턴을 사용하면 다양한 부품을 깔끔하게 추출할 수 있습니다.

In [11]: df.row.str.extract('(?P<fips>\d{5})((?P<state>[A-Z ]*$)|(?P<county>.*?), (?P<state_code>[A-Z]{2}$))')
Out[11]: 
    fips                    1           state           county state_code
0  00000        UNITED STATES   UNITED STATES              NaN        NaN
1  01000              ALABAMA         ALABAMA              NaN        NaN
2  01001   Autauga County, AL             NaN   Autauga County         AL
3  01003   Baldwin County, AL             NaN   Baldwin County         AL
4  01005   Barbour County, AL             NaN   Barbour County         AL

[5 rows x 5 columns]

다소 긴 정규식을 설명하려면:

(?P<fips>\d{5})
  • 숫자(5자리와 합니다.\d"fips".

다음 부분:

((?P<state>[A-Z ]*$)|(?P<county>.*?), (?P<state_code>[A-Z]{2}$))

어느쪽인가를 실행한다)| 의입니다).

(?P<state>[A-Z ]*$)
  • 숫자와 일치합니다( 「어느 번호」).* )[A-Z ] 이 이름을 "state"(문장 앞)$

또는

(?P<county>.*?), (?P<state_code>[A-Z]{2}$))
  • 맞다.*)가 표시됩니다
  • 쉼표와 공백
  • 숫자와 합니다.state_code(문장 앞)$를 참조해 주세요.

이 예에서는 다음과 같습니다.
첫 번째 2행은 "state"(county 및 state_code 열에 NaN을 남김)에 도달하고 마지막 3행은 county, state_code(state 열에 NaN을 남김)에 도달합니다.

df[['fips', 'row']] = df['row'].str.split(' ', n=1, expand=True)

공백(기본 구분 기호) 및 매개 변수별로 사용할 수 있습니다.expand=True★★★★★★에DataFrame "연결":

df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', 
                           '01001 Autauga County, AL', '01003 Baldwin County, AL', 
                           '01005 Barbour County, AL']})
print (df)
                        row
0       00000 UNITED STATES
1             01000 ALABAMA
2  01001 Autauga County, AL
3  01003 Baldwin County, AL
4  01005 Barbour County, AL



df[['a','b']] = df['row'].str.split(n=1, expand=True)
print (df)
                        row      a                   b
0       00000 UNITED STATES  00000       UNITED STATES
1             01000 ALABAMA  01000             ALABAMA
2  01001 Autauga County, AL  01001  Autauga County, AL
3  01003 Baldwin County, AL  01003  Baldwin County, AL
4  01005 Barbour County, AL  01005  Barbour County, AL

수정(필요한 경우 원본 열 삭제)

df[['a','b']] = df.pop('row').str.split(n=1, expand=True)
print (df)
       a                   b
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

같은 내용:

df[['a','b']] = df['row'].str.split(n=1, expand=True)
df = df.drop('row', axis=1)
print (df)

       a                   b
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

에러가 발생했을 경우:

#remove n=1 for split by all whitespaces
df[['a','b']] = df['row'].str.split(expand=True)

ValueError: 열의 길이는 키와 같아야 합니다.

.DataFrame 2 2: 2는 아니다.

print (df['row'].str.split(expand=True))
       0        1        2     3
0  00000   UNITED   STATES  None
1  01000  ALABAMA     None  None
2  01001  Autauga  County,    AL
3  01003  Baldwin  County,    AL
4  01005  Barbour  County,    AL

후 을 추가합니다.DataFrame기준:

df = pd.DataFrame({'row': ['00000 UNITED STATES', '01000 ALABAMA', 
                           '01001 Autauga County, AL', '01003 Baldwin County, AL', 
                           '01005 Barbour County, AL'],
                    'a':range(5)})
print (df)
   a                       row
0  0       00000 UNITED STATES
1  1             01000 ALABAMA
2  2  01001 Autauga County, AL
3  3  01003 Baldwin County, AL
4  4  01005 Barbour County, AL

df = df.join(df['row'].str.split(expand=True))
print (df)

   a                       row      0        1        2     3
0  0       00000 UNITED STATES  00000   UNITED   STATES  None
1  1             01000 ALABAMA  01000  ALABAMA     None  None
2  2  01001 Autauga County, AL  01001  Autauga  County,    AL
3  3  01003 Baldwin County, AL  01003  Baldwin  County,    AL
4  4  01005 Barbour County, AL  01005  Barbour  County,    AL

원래 열 제거(다른 열도 있는 경우):

df = df.join(df.pop('row').str.split(expand=True))
print (df)
   a      0        1        2     3
0  0  00000   UNITED   STATES  None
1  1  01000  ALABAMA     None  None
2  2  01001  Autauga  County,    AL
3  3  01003  Baldwin  County,    AL
4  4  01005  Barbour  County,    AL   

새 데이터 프레임을 만들지 않거나 데이터 프레임에 분할할 열보다 더 많은 열이 있는 경우 다음을 수행할 수 있습니다.

df["flips"], df["row_name"] = zip(*df["row"].str.split().tolist())
del df["row"]  

구분 기호를 기준으로 문자열을 두 개 이상의 열로 분할하려면 '최대 분할' 매개 변수를 생략할 수 있습니다.
다음과 같습니다.

df['column_name'].str.split('/', expand=True)

그러면 초기 문자열에 포함된 최대 필드 수만큼 열이 자동으로 생성됩니다.

아직 이걸 못 봐서 놀랐어.분할이 2개만 필요한 경우에는 를 권장합니다.

Series.str.partition

partition는 세퍼레이터에서 1회 분할을 실행하며 일반적으로 매우 높은 성능을 발휘합니다.

df['row'].str.partition(' ')[[0, 2]]

       0                   2
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

행의 이름을 변경해야 할 경우

df['row'].str.partition(' ')[[0, 2]].rename({0: 'fips', 2: 'row'}, axis=1)

    fips                 row
0  00000       UNITED STATES
1  01000             ALABAMA
2  01001  Autauga County, AL
3  01003  Baldwin County, AL
4  01005  Barbour County, AL

는, 「」를 사용해 .join ★★★★★★★★★★★★★★★★★」concat:

df.join(df['row'].str.partition(' ')[[0, 2]])

pd.concat([df, df['row'].str.partition(' ')[[0, 2]]], axis=1)

                        row      0                   2
0       00000 UNITED STATES  00000       UNITED STATES
1             01000 ALABAMA  01000             ALABAMA
2  01001 Autauga County, AL  01001  Autauga County, AL
3  01003 Baldwin County, AL  01003  Baldwin County, AL
4  01005 Barbour County, AL  01005  Barbour County, AL

df.assign새 df를 만듭니다.https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.assign.html 를 참조해 주세요.

split = df_selected['name'].str.split(',', 1, expand=True)
df_split = df_selected.assign(first_name=split[0], last_name=split[1])
df_split.drop('name', 1, inplace=True)

또는 메서드 체인 형식:

df_split = (df_selected
            .assign(list_col=lambda df: df['name'].str.split(',', 1, expand=False),
                    first_name=lambda df: df.list_col.str[0],
                    last_name=lambda df: df.list_col.str[1])
            .drop(columns=['list_col']))

해당하는 팬더 시리즈(즉, 필요한 컬럼)를 내보내는 것이 좋습니다.적용 기능을 사용하여 컬럼 콘텐츠를 여러 시리즈로 분할한 후 생성된 컬럼을 기존 DataFrame에 결합합니다.물론 소스 열은 삭제해야 합니다.

예.

 col1 = df["<col_name>"].apply(<function>)
 col2 = ...
 df = df.join(col1.to_frame(name="<name1>"))
 df = df.join(col2.toframe(name="<name2>"))
 df = df.drop(["<col_name>"], axis=1)

두 단어 문자열을 분할하는 기능은 다음과 같습니다.

lambda x: x.split(" ")[0] # for the first element
lambda x: x.split(" ")[-1] # for the last element

아무도 슬라이스 방식을 사용하지 않는 것을 보고 여기에 2센트를 넣었습니다.

df["<col_name>"].str.slice(stop=5)
df["<col_name>"].str.slice(start=6)

이 메서드는 두 개의 새 열을 만듭니다.

언급URL : https://stackoverflow.com/questions/14745022/how-to-split-a-dataframe-string-column-into-two-columns