str
Kullanılabilir erişimci pandas.Series
nesneler dtype == object
aslında bir iterable olduğunu.
Bir varsayalım 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)
Tekrarlanabilir olup olmadığını test edebiliriz
from collections import Iterable
isinstance(df.col.str, Iterable)
True
Daha sonra, diğer yinelemeleri yaptığımız gibi ondan da atayabiliriz:
var0, var1 = 'xy'
print(var0, var1)
x y
En basit çözüm
Yani bir satırda her iki sütunu da atayabiliriz
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
Daha hızlı çözüm
Sadece biraz daha karmaşık, zip
benzer bir yinelenebilir oluşturmak için kullanabiliriz
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
Çizgide
Anlamı, var olanı değiştirmeyin df
Bu işe yarar çünkü assign
anahtar kelimelerin yeni (veya mevcut) sütun adları olduğu ve değerlerin yeni sütunun değerleri olacağı anahtar kelime argümanlarını alır. Bir sözlük kullanabilir, onu paketinden çıkarabilir **
ve anahtar kelime argümanları olarak çalışmasını sağlayabilirsiniz. Bu 'g'
, df.col.str
yinelenebilirdeki ilk öğe ve yinelenebilirdeki 'h'
ikinci öğe olan yeni bir sütun atamanın akıllıca bir yoludur 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
Benim list
yaklaşımım
Modern liste anlayışı ve değişken paket açma ile.
Not: ayrıca satır içi kullanarakjoin
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
Değişen versiyon,
df[['e', 'f']] = pd.DataFrame([*df.col], df.index)
Naif Zaman Testi
Kısa DataFrame
Yukarıda tanımlanan birini kullanı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)
Uzun DataFrame
10 ^ 3 kat daha büyük
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)