split, for문 이용해서 2개로 나누고 새로운 dataframe으로 저장하는 방법이 있나요?

조회수 1457회

안녕하세요. split이랑 for문 연습 중인데 막힌 부분이 있어서요.

#1.
for i in range(len(df)) :

    df_split1[i], df_split2[i]=df.loc[i].split(sep='.', maxsplit=1)
#2.
for i in range(len(df)) :

    df.loc[i, 'c']=str(df.loc[i, 'a']).split(sep='.', maxsplit=1)[0]
    df.loc[i, 'd']=str(df.loc[i, 'a']).split(sep='.', maxsplit=1)[1]

Error code : Too many indexers

df 안에 asd.fgh 이런 형식으로 'a' column에 있어서 '.'을 기준으로 split해서 앞과 뒤를 따로 저장을 하고 싶은데요. 1번으로 안되서 2번으로 했는데 "Too many indexers" 라는 에러가 나와서요.

split을 사용해서 별도의 DataFrame을 만들거나 기존의 df에서 새로운 column을 추가해서 덧붙이고 싶은데 잘 안되네요.

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    ※ 다른 더 좋은 방법이 있을 수 있습니다.. 참고만 하시길

    data = {'a': ['asd.fgh', 'abcd.efg', '123.456']}
    df = pd.DataFrame(data=data)
    
    cList = []
    dList = []
    for idx, row in df.iterrows():
        charList = row['a'].split('.')
        cList.append(charList[0])
        dList.append(charList[1])
    
    df['c'] = pd.DataFrame(cList)
    df['d'] = pd.DataFrame(dList)
    
    print(df)
    
    #           a     c    d
    # 0   asd.fgh   asd  fgh
    # 1  abcd.efg  abcd  efg
    # 2   123.456   123  456
    

    그리고 뒤 늦게 위 코드를 다시 살펴봤는데, 잘 동작하는데요? 이게 저 보다 더 나은 방법 같기도.. ㅎㅎ

    data = {'a': ['asd.fgh', 'abcd.efg', '123.456', '123.456.789']}
    df = pd.DataFrame(data=data)
    
    for i in range(len(df)):
        df.loc[i, 'c'], df.loc[i, 'd'] = str(df.loc[i, 'a']).split(sep='.', maxsplit=1)
    
    print(df)
    
    #              a     c        d
    # 0      asd.fgh   asd      fgh
    # 1     abcd.efg  abcd      efg
    # 2      123.456   123      456
    # 3  123.456.789   123  456.789
    
  • str.split + expand=True 가 가장 간단합니다.

    Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license()" for more information.
    >>> import pandas as pd
    
    >>> df = pd.DataFrame({"a":[ "abc,def", "eig,esi", "333,ee1"]})
    >>> df
             a
    0  abc,def
    1  eig,esi
    2  333,ee1
    >>> df["a"].str.split(",")
    0    [abc, def]
    1    [eig, esi]
    2    [333, ee1]
    Name: a, dtype: object
    >>> df["a"].str.split(",", expand=True)
         0    1
    0  abc  def
    1  eig  esi
    2  333  ee1
    
    
    >>> df[["a1", "a2"]] = df["a"].str.split(",", expand=True)
    >>> df
             a   a1   a2
    0  abc,def  abc  def
    1  eig,esi  eig  esi
    2  333,ee1  333  ee1
    >>> 
    
    • 그렇습니다! 빠르고 간단하고 효율적이네요. 감사합니다 whistler7899 2021.8.11 15:56
    • 감사합니다. for문을 사용해보고 싶긴 했는데 확실 효율적인 방법이네요 :) 물먹는하마 2021.8.12 12:13
    • @Chang : 데이터프레임을 for 로 접근하여 조작하는 건 매우 비효율적입니다. (속도가 느려짐.) nowp 2021.8.12 18:02
    • 아 그런가요.. 어쩐지 뭔가 점점 느려지는 느낌이더라고요. 조언 감사드립니다. 물먹는하마 2021.8.13 17:08

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)