TL; DR versiyonu:
Basit bir durum için:
- Sınırlayıcı içeren bir metin sütunum var ve iki sütun istiyorum
En basit çözüm:
df['A'], df['B'] = df['AB'].str.split(' ', 1).str
Veya bölmenin her girişi için otomatik olarak aşağıdakileri içeren bir sütun içeren bir DataFrame oluşturabilirsiniz:
df['AB'].str.split(' ', 1, expand=True)
Sen kullanmalısınız expand=True
Dizeleriniz böler bir düzgün olmayan numarasına sahip ve isterseniz None
eksik değerleri değiştirmek için.
Her iki durumda da, .tolist()
yöntemin nasıl gerekli olmadığına dikkat edin . İkisi de değil zip()
.
Detayda:
Andy Hayden'ın çözümü , str.extract()
yöntemin gücünü göstermede en mükemmel çözümdür .
Ancak bilinen bir ayırıcı üzerinde basit bir bölünme için (örneğin, tire ile bölme veya boşlukla bölme), .str.split()
yöntem yeterlidir 1 . Dize sütunu (Seri) üzerinde çalışır ve bir liste sütunu (Seri) döndürür:
>>> import pandas as pd
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
>>> df
AB
0 A1-B1
1 A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df
AB AB_split
0 A1-B1 [A1, B1]
1 A2-B2 [A2, B2]
1: İlk iki parametrenin ne yapacağından emin değilseniz , yöntemin düz Python sürümü.str.split()
için dokümanları öneririm .
Ama nasıl gidiyorsun:
- iki elemanlı listeler içeren bir sütun
için:
- her biri listelerin ilgili öğesini içeren iki sütun?
.str
Bir sütunun özelliğine daha yakından bakmamız gerekiyor .
Bir sütundaki her öğeyi dize olarak ele alan yöntemleri toplamak ve ardından her öğedeki ilgili yöntemi mümkün olduğunca verimli uygulamak için kullanılan büyülü bir nesnedir:
>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})
>>> upper_lower_df
U
0 A
1 B
2 C
>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()
>>> upper_lower_df
U L
0 A a
1 B b
2 C c
Ancak, bir dizenin her öğesini dizinine göre almak için bir "dizinleme" arayüzüne de sahiptir:
>>> df['AB'].str[0]
0 A
1 A
Name: AB, dtype: object
>>> df['AB'].str[1]
0 1
1 2
Name: AB, dtype: object
Tabii ki, bu indeksleme arayüzü, indeksleyebildiği .str
her öğenin aslında bir dize olup olmadığını, umursamazsa gerçekten umursamaz, bu yüzden:
>>> df['AB'].str.split('-', 1).str[0]
0 A1
1 A2
Name: AB, dtype: object
>>> df['AB'].str.split('-', 1).str[1]
0 B1
1 B2
Name: AB, dtype: object
Ardından, Python grubunun tekrar tekrar açılmasını sağlamak basit bir konudur
>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str
>>> df
AB AB_split A B
0 A1-B1 [A1, B1] A1 B1
1 A2-B2 [A2, B2] A2 B2
Tabii ki, bir DataFrame'i bir dize sütununu bölmekten çıkarmak o kadar kullanışlıdır ki, .str.split()
yöntem expand=True
parametre ile sizin için yapabilir :
>>> df['AB'].str.split('-', 1, expand=True)
0 1
0 A1 B1
1 A2 B2
Yani, istediğimizi gerçekleştirmenin başka bir yolu da:
>>> df = df[['AB']]
>>> df
AB
0 A1-B1
1 A2-B2
>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
AB A B
0 A1-B1 A1 B1
1 A2-B2 A2 B2
expand=True
Versiyonu, bununla birlikte daha uzun, demet açma yöntemi üzerinde belirgin bir avantajı vardır. Demet açma, farklı uzunluklardaki bölünmelerle iyi başa çıkmaz:
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})
>>> df
AB
0 A1-B1
1 A2-B2
2 A3-B3-C3
>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')
Traceback (most recent call last):
[...]
ValueError: Length of values does not match length of index
>>>
Ancak yeterli "bölünme" olmayan sütunları expand=True
yerleştirerek güzel bir şekilde işler None
:
>>> df.join(
... df['AB'].str.split('-', expand=True).rename(
... columns={0:'A', 1:'B', 2:'C'}
... )
... )
AB A B C
0 A1-B1 A1 B1 None
1 A2-B2 A2 B2 None
2 A3-B3-C3 A3 B3 C3
read_table()
veyaread_fwf()