ตัวเข้าถึงstr
ที่พร้อมใช้งานสำหรับpandas.Series
อ็อบเจ็กต์dtype == 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)