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 답변
-
※ 다른 더 좋은 방법이 있을 수 있습니다.. 참고만 하시길
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
댓글 입력