Python 基于其他列值编辑列值

Python 基于其他列值编辑列值,python,pandas,Python,Pandas,我有一个pandas.DataFrame,我需要根据几列中的值以及所需列中的值进行更新。我知道这是一种不好的做法。这只是一个例子 以下是我正在使用的示例: 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

我有一个
pandas.DataFrame
,我需要根据几列中的值以及所需列中的值进行更新。我知道这是一种不好的做法。这只是一个例子

以下是我正在使用的示例:

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               
定义一个函数,然后对所有行应用

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

这正是我要找的!我从数据帧中删除了addr_ad1和addr_ad2列,因为它们只需要进行计算。我将它们添加到函数中,如下所示:addr\u ad1=anydigit(row.addr\u 1)。非常感谢。