根据其他列值编辑列值

问题描述:

我有一个pandas.DataFrame,我需要根据需要更新的列中的值根据列中的值进行更新。 NAME被命名为别的,因为我知道这是不好的做法。这只是例子。根据其他列值编辑列值

以下是我与工作的一个样本:

import re 
import pandas as pd 

def anydigit(text): 
    find_digit = re.search(r'\d+', text) 
    if find_digit: 
     return find_digit.start() 
    else: 
     return 0 

df = pd.DataFrame({'DPID': ['A1', 'A2'], 'NAME': ['John Doe', 'Jane Doe'], 
        'ADDR_1': ['123 MAIN ST', 'ATTN: JOHN DOE'], 'ADDR_2': ['', 'P O BOX 123456']}) 
df['addr_ad1'] = df['ADDR_1'].apply(anydigit) 
df['addr_ad2'] = df['ADDR_2'].apply(anydigit) 
df['AUX_ADDR_LINE'] = '' 

这是需要采取什么措施。

If addr_ad1 == 0 and addr_ad2 > 0: 
    aux_addr_line = addr_1 
    addr_1 = addr_2 
    addr_2 = '' 
elfif addr_ad1 > 0 and re.sub(r'\s+', '', addr_2)[:4] == 'POBOX': 
    aux_addr_line = '' 
    addr_1 = addr_1 
    addr_2 = '' 
elif addr_ad2 > 0 and re.sub(r'\s+', '', addr_1)[:4] == 'POBOX': 
    aux_addr_line = '' 
    addr_1 = addr_2 
    addr_2 = '' 

我会认为.apply()会工作,但不知道我会怎么写。

调整一些变量名:

def anydigit(text): 
    find_digit = re.search(r'\d+', text) 
    if find_digit: 
     return find_digit.start() 
    else: 
     return 0 

df = pd.DataFrame({'DPID': ['A1', 'A2'], 'NAME': ['John Doe', 'Jane Doe'], 
        'addr_1': ['123 MAIN ST', 'ATTN: JOHN DOE'], 'addr_2': ['', 'P O BOX 123456']}) 
df['addr_ad1'] = df['addr_1'].apply(anydigit) 
df['addr_ad2'] = df['addr_2'].apply(anydigit) 
df['aux_addr_line'] = '' 

入手:

DPID  NAME   addr_1   addr_2 addr_ad1 addr_ad2 \ 
0 A1 John Doe  123 MAIN ST       0   0 
1 A2 Jane Doe ATTN: JOHN DOE P O BOX 123456   0   8 

    aux_addr_line 
0     
1    

定义一个函数,然后apply到所有行:

def change_address(row): 
    if row.addr_ad1 == 0 and row.addr_ad2 > 0: 
     row.aux_addr_line = row.addr_1 
     row.addr_1 = row.addr_2 
     row.addr_2 = '' 
    elif row.addr_ad1 > 0 and re.sub(r'\s+', '', row.addr_2)[:4] == 'POBOX': 
     row.aux_addr_line = '' 
     row.addr_1 = row.addr_1 
     row.addr_2 = '' 
    elif row.addr_ad2 > 0 and re.sub(r'\s+', '', row.addr_1)[:4] == 'POBOX': 
     row.aux_addr_line = '' 
     row.addr_1 = row.addr_2 
     row.addr_2 = '' 
    return row 

df = df.apply(change_address, axis=1) 

获得:

DPID  NAME   addr_1 addr_2 addr_ad1 addr_ad2 aux_addr_line 
0 A1 John Doe  123 MAIN ST    0   0     
1 A2 Jane Doe P O BOX 123456    0   8 ATTN: JOHN DOE 
+0

这正是我所期待的!我从数据框中删除了addr_ad1和addr_ad2列,因为它们只用于计算。我将它们添加到函数中,如下所示:addr_ad1 = anydigit(row.addr_1)。谢谢! –

+0

不客气。 – Stefan