2015-02-25 4 views
0

Я получил этоНовые Панды dataframe колонка не меняется

def email(cell): 
pattern = '[A-Z0-9a-z._%+-][email protected][A-Z0-9a-z.-]+\.[A-Za-z]{2,4}' 
try: 
    x = re.search(pattern, cell) 
    return x.group(0) 
except AttributeError: 
    pass 

def name(cell): 
middle = '[A-Za-z]+\s[A-Za-z]\.\s[A-Za-z]+' 
no_middle = '[A-Za-z]+\s[A-Za-z]+' 
try: 
    x = re.search(middle, cell) 
    return x.group() 
except AttributeError: 
    try: 
     x = re.search(no_middle, cell) 
     return x.group() 
    except AttributeError: 
     pass 


def rename_cells(dataframe): 
dataframe['J'] = '' 
dataframe['K'] = '' 
for index, row in dataframe.iterrows(): 
    row['J'] = email(row.I) 
    row['K'] = name(row.I) 
    x = row.I.replace([str(row.K), str(row.J)], '') 
    row.I = x 

Мои данные заполнены различными предметами из AH столбца, и столбец «Я» есть пункт, который я сопрягая с помощью регулярных выражений, чтобы вытащить определенный Предметы. Я тестировал регулярное выражение, и притяжения работают нормально, однако, когда я пытаюсь использовать функцию rename_cells, я заканчиваю столбцами J и K пустым с столбцом I так же, как и раньше, и без каких-либо замен. Есть предположения?

Образец данных:

df_stack = pd.DataFrame({'A':['aaa','bbb','ccc', 'eee'],'B':['aaa','bbb','ccc', 'eee'], 'C': ['aaa','bbb','ccc', 'eee'], 'D': ['aaa','bbb','ccc', 'eee'], 'E': ['aaa','bbb','ccc', 'eee'], 'F': ['aaa','bbb','ccc', 'eee'], 'G': ['aaa','bbb','ccc', 'eee'], 'H':['aaa','bbb','ccc', 'eee'], 'I':['John A. Smith [email protected]','Stacy Smith [email protected]','Jimbo G. Smith [email protected]', 'John Apple [email protected]']}) 

Это должно создать подобный dataframe стиль. Я хотел бы что-то похожее на это:

df_new = pd.DataFrame({'A':['aaa','bbb','ccc', 'eee'],'B':['aaa','bbb','ccc', 'eee'], 'C': ['aaa','bbb','ccc', 'eee'], 'D': ['aaa','bbb','ccc', 'eee'], 'E': ['aaa','bbb','ccc', 'eee'], 'F': ['aaa','bbb','ccc', 'eee'], 'G': ['aaa','bbb','ccc', 'eee'], 'H':['aaa','bbb','ccc', 'eee'], 'I':['John A. Smith', 'Stacy Smith ','Jimbo G. Smith', 'John Apple'], 'J': ['[email protected]', '[email protected]', '[email protected]', '[email protected]']}) 

Спасибо за любую проницательность

+0

You» не работая на копии, а не в представлении, вам необходимо прочитать следующее: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy – EdChum

+0

Также вы можете создать новый строк, вызывая 'apply', что было бы намного легче читать, чем то, что вы делаете, – EdChum

+0

, поэтому я попытался заменить row ['J'] и row ['K'] с row.loc ('J') и row.loc ('K'), но это оказалось в некоторых сообщениях об ошибках. Я просто делаю все это неправильно с помощью цикла для индекса и строки? Должен ли я просто применить функцию непосредственно к row.loc ('I')? – nahata5

ответ

0

Похоже, все ваше делание только отделяя имя из электронной почты, сырого способа сделать это, который будет работать ваш набор данные это:

In [22]: 

df_stack['I'], df_stack['J'] = df_stack.I.str.split(' ').str[:-1].str.join(' '), df_stack.I.str.split(' ').str[-1] 
df_stack 
Out[22]: 
    A B C D E F G H    I \ 
0 aaa aaa aaa aaa aaa aaa aaa aaa John A. Smith 
1 bbb bbb bbb bbb bbb bbb bbb bbb  Stacy Smith 
2 ccc ccc ccc ccc ccc ccc ccc ccc Jimbo G. Smith 
3 eee eee eee eee eee eee eee eee  John Apple 

         J 
0 [email protected] 
1 [email protected] 
2 [email protected] 
3 [email protected] 

так что это использует vectorised str метода разделить на пространствах, мы можем легко получить по электронной почте, как это последний элемент в списке разделенного на имя мы берем остальные элементы и воссоединиться с помощью пространство.

EDIT

Для бита электронной почты, мы можем просто использовать то же регулярное выражение и называем findall, для другого бита мы просто передать FUNC как пары для `применяются:

In [39]: 

import re 

def name(cell): 
    middle = '[A-Za-z]+\s[A-Za-z]\.\s[A-Za-z]+' 
    no_middle = '[A-Za-z]+\s[A-Za-z]+' 
    try: 
     x = re.search(middle, cell) 
     return x.group() 
    except AttributeError: 
     try: 
      x = re.search(no_middle, cell) 
      return x.group() 
     except AttributeError: 
      pass 
df_stack['J'] = df_stack['I'].str.findall('[A-Z0-9a-z._%+-][email protected][A-Z0-9a-z.-]+\.[A-Za-z]{2,4}').str[0] 
df_stack['I'] = df_stack['I'].apply(name) 
df_stack 
Out[39]: 
    A B C D E F G H    I \ 
0 aaa aaa aaa aaa aaa aaa aaa aaa John A. Smith 
1 bbb bbb bbb bbb bbb bbb bbb bbb  Stacy Smith 
2 ccc ccc ccc ccc ccc ccc ccc ccc Jimbo G. Smith 
3 eee eee eee eee eee eee eee eee  John Apple 

         J 
0 [email protected] 
1 [email protected] 
2 [email protected] 
3 [email protected]l.com 
+0

ах, это было бы намного проще, но примеры данных, к сожалению, намного проще реальных значений, имена и адреса электронной почты вставляются в гораздо большую строку, которая почему мне нужно было использовать эти функции электронной почты и имя – nahata5

+0

@ nahata5 ОК, я обновил свой код, мы можем использовать ваше регулярное выражение для электронной почты непосредственно как параметр для 'findall', для бита имени мы можем просто передать это как параметр для 'apply' – EdChum

+0

это способ сделать это, спасибо, что отлично работает. Хотелось бы, чтобы я понял, что копия в сравнении с представлением немного больше. Я понимаю, что моя функция была применена к неправильной ... но как еще вы можете прокручивать строки и данные сот без нее? – nahata5

Смежные вопросы