2016-04-05 3 views
0

У меня есть список, который выглядит следующим образом: li = ['ShortHair','LongHair','Medium Hair']Python. Как обновить столбец, взяв подстроку из другого столбца?

Я хочу, чтобы проверить, если col2 содержит какой-либо из вышеперечисленных подстрок, если он действительно принимает его от col2 и обновления col3. Если это не так, то оставить col3 как есть.

 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 

получить:

 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 

EDIT: Если несколько вхождений подстроки есть в массиве, удалите обе формы col2 и обновить col3 с первым значением.

Я могу удалить подстроку из col2, однако я не могу обновить col3. Я пробовал:

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

Это дает IndexError: list index out of range Ошибка.

Как я могу это сделать?

+0

Что делать, если у вас есть длинный или короткошерстный? Что должно содержать col3 и почему? – Alexander

+0

Удалите оба, держите первым. Я обновлю вопрос – harshit

+0

@Alexander. Я уверен, что этого не произойдет в наборе данных, который я использую. Тем не менее, для моих целей, чтобы получить первое значение, – harshit

ответ

1

Создать образец dataframe:

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']}) 

Использование лямбда-выражения со списком понимания, чтобы найти все соответствующие слова на каждой строке. Это временный столбец, который будет удален позже.

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

Создайте маску этих строк, содержащих соответствующие слова.

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

Используя маску и .loc, обновить col3 с первым совпадающим словом.

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

Используйте лямбда-выражение вместе с reduce, чтобы удалить каждое слово из соответствия col2:

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

Удалите временную колонку совпадающих слов.

del df['matches'] 

Подтвердить результаты.

>>> 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 
Смежные вопросы