2016-04-08 28 views
1

Bir milyondan fazla satır içeren bir DataFrame pandasım var ve verileri normalleştirmeye çalışırken tüm benzersiz değerleri (belirli bir sütun için) bulmam gerekiyor. Verilen sütundaki veriler, şehir adlarını temsil eden tip dizgedir - ve normalde verileri normalleştirmede çok uzun bir yol katettim. Sütundaki tüm değerleri daha düşük bir değerle kaplamak, şeritleme yapmak ve pandas.core.frame.DataFrame.replace() numaralı ifadeleri kullanmak veriler için açık görünüyordu.pandalarda gerçek benzersiz değerler regex ile eşleşecek DataFrame nasıl bulunur

numunesi ben (ve elde etmek istiyorum) aşağıda ne buldum: Bundan daha verilerin

In [1018]: sample 
Out[1018]: 
     0 
0  warsaw ## -> warsaw 
1  krakow ## -> krakow 
2 warszawa ## -> warsaw 
3 cracovie ## -> krakow 
4 warsawa ## -> warsaw 
5  krkow ## -> krakow 
6  krąków ## -> krakow 
7 krakowie ## -> krakow 
8  kraków ## -> krakow 
9 varşovia ## -> warsaw 
10 warschau ## -> warsaw 

sadece çok daha büyük seti, ben reg kullanarak farklı şehir isimlerinin varyasyonları aramanıza gerek böyle Veri kümesindeki tüm sürümleri bulmak ve normalleştirme ile devam etmek için ifadeler. Ben neyi Ancak

In [1029]: df.column_a.str.contains(r"\bwar.*") 
Out[1029]: 
0  True 
1  False 
2  False 
3  True 
4  False 
5  False 
6  False 
7  False 
8  False 
9  False 
10  False 
    ... 

: Verilen regex maç değerleri -

In [1023]: df.column_a.unique() 
Out[1023]: 
array(['warsaw', 'bydgoszcz', 'null', ..., 'kłodawa', 'kościelna wieś', 
    'poznań-jeżyce'], dtype=object) 

In [1024]: len(df.column_a.unique()) 
Out[1024]: 3798 

Ben .str.contains() ile denedim ama sadece olan göstergeler için bir boolean alıyorum - tanımlı sütununda Aradığınız, verilen normal ifadeyle eşleşen gerçek değerleri elde etmektir. Yukarıdaki örnek için ben gibi bir şey elde edebilmek istiyorum: Şimdi bir DataFrame sütununda benzersiz değerleri döndürmek için bir arama çalışması için bir yol bulduk

['warsaw','warszawa','warsawa','warschau'] 
+1

Bu $$ içinde büyük bir acı olacak, düşürmek zorunda -case, heceleri normalleştirin, levenshtein veya jaccard gibi bir tür benzerlik hesaplayın, ancak bunun üzerine farklı dillerde girişleriniz var !! Eğer bir tür sözlüğe erişiminiz varsa, bu girişleri eşleştirebilir ve bunları – EdChum

+1

ile aynı kök kelimesine normalleştirebilirsiniz. Bunu yapmak için aslında regex ile yaptığınız her şeyin * korkunç * olması gerektiğini düşünün. – n1c9

+0

@ n1c9 Çalışan df.column_a = df.column_a.str.lower() 've' df.column_a = df.column_a.str.strip() 'aslında çok hızlıdır. Bunu sadece bir kez yapmak zorundayım, çözümün uzun vadede ne kadar iyi performans gösterdiğiyle ilgilenmiyorum. – Thanos

cevap

1

Kullanım boole indeksleme boş değerler bunu varsa document

In [143] df[df.column_a.str.contains(r'\bwar.*')] 
    Out [143] 
    0  warsaw 
    2 warszawa 
    4 warsawa 
    10 warschau 

bakınız:

df[pd.notnull(df.column_a) & df.column_a.str.contains(r'\bwar.*')] 
+0

Teşekkürler! Bunu denemede hata oluştu: 'ValueError: NA/NaN değerlerini içeren vektör ile indekslenemiyor. Sanırım tüm NaN değerlerini boş dize veya benzeri ile değiştirmeyi denemeliyim. – Thanos

+0

Cevabı güncelle - boş değerler varsa ne olur? – Abbas

0

. Çözüm bunun yerine extract değerleridir. Yukarıda açıklandığı gibi sorun için

, yerine str.contains()

In [1311]: df.column_a.str.extract(r"\b(war.*)").unique() 
Out[1311]: 
array(['warsaw', nan, 'waraszawa', 'warszawskiej', 'warszawy', 'warzawa', 
    'warsza', 'warrszawa', 'warzszawa', 'warszawan', 'warszawie', 
    'warwszawa', 'warszawski', 'warzno 84-208', 'warasza, wola', 
    'warszawskie', 'warzsawa', 'warzno', 'warszawa', 'warszwa', 'warsawa'], dtype=object) 

daha iyi bir çözüm olabilir ne str.extract() kullandık, ama bu kesin bir tanesidir. -

İlgili konular