2016-04-05 29 views
0

Ben şöyle bir liste var: li = ['ShortHair','LongHair','Medium Hair'] Ben col2 ve güncelleme col3 dan götürün eğer col2, yukarıdaki alt dize birini içeriyorsa kontrol etmek istiyorumPython- Başka bir sütundan alt dizeyi alarak sütun nasıl güncellenir?

. Eğer değilse, o zaman col3 bırakın.

 col1 col2    col3 
0  w I have ShortHair  U 
1  x LongHair You Have  V 
2  y I have no hair  W 
3  z Look Medium Hair!  L 

almak için:

 col1 col2    col3 
0  w I have    ShortHair 
1  x You Have   LongHair 
2  y I have no hair  W 
3  z Look !    Medium Hair 

DÜZENLEME: substring birden oluşumları dizisinde var ise, her ikisi de bir şekilde col2 çıkarın ve ilk değere sahip Col3 güncelleştirmek.

Katmanları col2'den kaldırabilirim, ancak col3'ü güncelleyemiyorum. Denedim:

data[data.col2.str.contains('|'.join(li)),"col3"] = data["col2"].map(lambda x: re.findall('|'.join(li),x)[0]) 

O IndexError: list index out of range hata veriyor.

Bunu en iyi nasıl yapabilirim?

+0

Ya "Sen LongHair veya ShortHair var"? Col3 ne içermeli ve neden? – Alexander

+0

Her ikisini de kaldırın, önce saklayın. – harshit

+0

@Alexander sorusunu güncelleyeceğim. Bunun kullanıyorum veri kümesinde olmaz. Ancak, benim amacım için, ilk değeri almak yeterlidir. – harshit

cevap

1

örnek dataframe oluşturun:

df = pd.DataFrame(
    {'col1': ['w', 'x', 'y', 'z'], 
    'col2': ['I have ShortHair', 'LongHair You Have', 'I have no hair', 'Look Medium Hair!'], 
    'col3': ['U', 'V', 'W', 'L']}) 

her satır eşleşen tüm kelimeleri bulmak için bir liste anlayışı ile lambda ifade kullanın. Bu daha sonra silinecek geçici bir sütundur.

df['matches'] = df.col2.apply(lambda sentence: [word for word in li if word in sentence]) 

Eşleşen sözcükler içeren bu satırlardan oluşan bir maske oluşturun. maske ve .loc kullanma

mask = df.matches.apply(len) > 0 

, ilk eşleşen kelime ile col3 güncelleyin.

df.loc[mask, 'col3'] = df.loc[mask, 'matches'].str[0] 

col2 her uygun sözcüğü kaldırmak reduce ile birlikte bir lambda ifade kullanın:

df.loc[mask, 'col2'] = (
    df.loc[mask, 'col2'].apply(lambda sentence: 
           reduce(lambda remaining_sentence, word: 
             remaining_sentence.replace(word, ''), li, sentence))) 

eşleşen kelimeleri geçici sütun silin.

del df['matches'] 

Sonuçları onaylayın.

>>> df 
    col1   col2   col3 
0 w   I have  ShortHair 
1 x  You Have  LongHair 
2 y I have no hair   W 
3 z   Look ! Medium Hair 
İlgili konular