의 개체에 str사용할 수 있는 접근 자는 실제로 반복 가능합니다.pandas.Seriesdtype == object
가정 pandas.DataFrame df:
df = pd.DataFrame(dict(col=[*zip('abcdefghij', range(10, 101, 10))]))
df
col
0 (a, 10)
1 (b, 20)
2 (c, 30)
3 (d, 40)
4 (e, 50)
5 (f, 60)
6 (g, 70)
7 (h, 80)
8 (i, 90)
9 (j, 100)
반복 가능한지 테스트 할 수 있습니다.
from collections import Iterable
isinstance(df.col.str, Iterable)
True
그런 다음 다른 이터 러블처럼 할당 할 수 있습니다.
var0, var1 = 'xy'
print(var0, var1)
x y
가장 간단한 솔루션
따라서 한 줄에 두 열을 할당 할 수 있습니다.
df['a'], df['b'] = df.col.str
df
col a b
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
더 빠른 솔루션
약간 더 복잡 zip하지만 비슷한 반복 가능한
df['c'], df['d'] = zip(*df.col)
df
col a b c d
0 (a, 10) a 10 a 10
1 (b, 20) b 20 b 20
2 (c, 30) c 30 c 30
3 (d, 40) d 40 d 40
4 (e, 50) e 50 e 50
5 (f, 60) f 60 f 60
6 (g, 70) g 70 g 70
7 (h, 80) h 80 h 80
8 (i, 90) i 90 i 90
9 (j, 100) j 100 j 100
인라인
의미, 기존을 변경하지 마십시오 . 키워드가 새 (또는 기존) 열 이름이고 값이 새 열의 값인 키워드 인수를 사용 df
하기 때문에 작동합니다 assign. 사전을 사용하고 압축을 풀고 **키워드 인수로 작동하도록 할 수 있습니다 . 따라서 이것은 이터 러블 'g'의 첫 번째 항목이고 df.col.str이터 러블 'h'의 두 번째 항목 인 새 열을 할당하는 영리한 방법입니다 df.col.str.
df.assign(**dict(zip('gh', df.col.str)))
col g h
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
내 버전의 list접근 방식
현대적인 목록 이해 및 변수 풀기.
참고 : 또한 인라인 사용join
df.join(pd.DataFrame([*df.col], df.index, [*'ef']))
col g h
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
돌연변이 버전은
df[['e', 'f']] = pd.DataFrame([*df.col], df.index)
순진한 시간 테스트
짧은 DataFrame
위에 정의 된 것을 사용하십시오.
%timeit df.assign(**dict(zip('gh', df.col.str)))
%timeit df.assign(**dict(zip('gh', zip(*df.col))))
%timeit df.join(pd.DataFrame([*df.col], df.index, [*'gh']))
1.16 ms ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
635 µs ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
795 µs ± 42.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
긴 DataFrame
10 ^ 3 배 더 큼
df = pd.concat([df] * 1000, ignore_index=True)
%timeit df.assign(**dict(zip('gh', df.col.str)))
%timeit df.assign(**dict(zip('gh', zip(*df.col))))
%timeit df.join(pd.DataFrame([*df.col], df.index, [*'gh']))
11.4 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.1 ms ± 41.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.33 ms ± 35.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)