Trình truy str
cập có sẵn cho pandas.Series
các đối tượng dtype == object
thực sự là một có thể lặp lại.
Giả sử một 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)
Chúng tôi có thể kiểm tra xem nó có phải là một
from collections import Iterable
isinstance(df.col.str, Iterable)
True
Sau đó, chúng tôi có thể gán từ nó giống như chúng tôi thực hiện các bước lặp khác:
var0, var1 = 'xy'
print(var0, var1)
x y
Giải pháp đơn giản nhất
Vì vậy, trong một dòng, chúng ta có thể chỉ định cả hai cột
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
Giải pháp nhanh hơn
Chỉ phức tạp hơn một chút, chúng ta có thể sử dụng zip
để tạo một tệp có thể lặp lại tương tự
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
Nội tuyến
Có nghĩa là, không thay đổi hiện tại df
Điều này hoạt động vì assign
lấy các đối số từ khóa trong đó từ khóa là tên cột mới (hoặc hiện có) và giá trị sẽ là giá trị của cột mới. Bạn có thể sử dụng một từ điển và giải nén nó **
và để nó hoạt động như các đối số từ khóa. Vì vậy, đây là một cách thông minh để gán một cột mới có tên 'g'
là mục đầu tiên trong có thể df.col.str
lặp và 'h'
đó là mục thứ hai trong có thể df.col.str
lặp.
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
Phiên bản của tôi về list
cách tiếp cận
Với khả năng hiểu danh sách hiện đại và khả năng giải nén có thể thay đổi.
Lưu ý: cũng sử dụng nội tuyếnjoin
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
Phiên bản đột biến sẽ là
df[['e', 'f']] = pd.DataFrame([*df.col], df.index)
Kiểm tra thời gian ngây thơ
DataFrame ngắn
Sử dụng một định nghĩa ở trên
%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 dài
Lớn gấp 10 ^ 3 lần
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)