2013-03-14 15 views
8

pandas numaralı DataFrame numaralı belgede, metin dizeleriyle df.strings adlı bir sütunu kullanıyorum. Bu dizelerin tek tek sözcüklerini kendi satırlarında diğer sütunlar için aynı değerler ile almak istiyorum. nasılVarolan bir satırın dizesindeki sözcükleri içeren pandalar veri karesinde yeni satırları nasıl oluşturabilirim?

Strings Time 
0 The dog 4Pm 
1 lazy dog 2Pm 
2 The fox 1Pm 

ben ama bunun dışında tamamen aynı sütunlu, dizesinden kelimeleri içeren yeni satırlar istiyorum

Strings --- Words ---Time 
"The dog" --- "The" --- 4Pm 
"The dog" --- "dog" --- 4Pm 
"lazy dog"--- "lazy"--- 2Pm 
"lazy dog"--- "dog" --- 2Pm 
"The fox" --- "The" --- 1Pm 
"The fox" --- "fox" --- 1Pm 

Bilmek: Mesela ben 3 dizeleri (ve alakasız bir sütun, Zaman) varsa endeks & diğer değişkenleri korurken

string_list = '\n'.join(df.Strings.map(str)) 
    word_list = re.findall('[a-z]+', Strings) 

Ama nasıl dataframe içine bu alabilirsiniz: dizeleri kelimeleri bölmek? Python 2.7 ve pandalar 0.10.1 kullanıyorum.

DÜZENLEME:

def f(group): 
    row = group.irow(0) 
    return DataFrame({'words': re.findall('[a-z]+',row['Strings'])}) 
df.groupby('class', group_keys=False).apply(f) 

Hala diğer sütunları korumak istiyorum: Şimdi this question bulunan GroupBy kullanarak satırları genişletmek için nasıl anlıyoruz. Mümkün mü?

+1

Gerçekten endeksi benzersiz olması gerekiyordu çünkü endeksi korumak için bir anlam ifade etmiyor. Değerleri birden çok satıra genişletmek için, [bu benzer soruya] bakın (http://stackoverflow.com/questions/15255181/questions-about-pandas-expanding-multivalued-column-inverting-and-grouping/15255472#15255472). – BrenBarn

+0

Teşekkürler! Sorumu düzenledim ve diziyle ilgili bölümü kaldırdım. Şimdi değerleri birden çok satıra genişletebiliyorum, ama yine de diğer sütunları koruyalım –

cevap

12

İşte groupby() kullanmayan kodum, daha hızlı olduğunu düşünüyorum.

import pandas as pd 
import numpy as np 
import itertools 

df = pd.DataFrame({ 
"strings":["the dog", "lazy dog", "The fox jump"], 
"value":["a","b","c"]}) 

w = df.strings.str.split() 
c = w.map(len) 
idx = np.repeat(c.index, c.values) 
#words = np.concatenate(w.values) 
words = list(itertools.chain.from_iterable(w.values)) 
s = pd.Series(words, index=idx) 
s.name = "words" 
print df.join(s) 

Thre sonucu:

 strings value words 
0  the dog  a the 
0  the dog  a dog 
1  lazy dog  b lazy 
1  lazy dog  b dog 
2 The fox jump  c The 
2 The fox jump  c fox 
2 The fox jump  c jump 
+0

Works harika, teşekkürler! –

+3

Neden 'words = list (itertools.chain.from_iterable (w.values))' 'words = np.concatenate (w.values)' tercih edilir? – suzanshakya

İlgili konular