我正在尝试使用字符串方法根据其他三个列的条件计算一个新列。
样本数据:
d = pd.DataFrame({'street1': ['1000 foo dr', '1001 bar dr', '1002 foo dr suite101', '1003 bar dr'],
'street2': ['city_a', np.nan, 'suite 101', 'suite 102'],
'city': ['city_a', 'city_b', np.nan, 'city_c']})
street1 street2 city
1000 foo dr city_a city_a
1001 bar dr NaN city_b
1002 foo dr suite101 suite 101 NaN
1003 bar dr suite 102 city_c
理想输出:
Address
1000 foo dr
1001 bar dr
1002 foo dr suite 101
1003 bar dr suite 102
这里的想法是
如果street2
匹配city
,忽略
如果street2
匹配的结尾street1
,则忽略
否则,连接street1
和street2
我试过的:
def address_clean(row):
if not row['street2']:
return row['street1']
if row['street2'] == row['city']:
return row['street1']
elif row['street1'].str.replace(' ', '').find(row['street2'].str.replace(' ', '')) != -1:
return row['street1']
else:
return row['street1'] + row['street2']
d.apply(lambda row: address_clean(row), axis=1).head()
这个给我一个错误:
AttributeError: ("'str' object has no attribute 'str'", 'occurred at index 1')
似乎row[street1]是一个string而不是一个pd.Series。但是,即使我.str从原来的函数中删除了这个部分,它变成了:
def address_clean(row):
if not row['street2']:
return row['street1']
if row['street2'] == row['city']:
return row['street1']
elif row['street1'].replace(' ', '').find(row['street2'].replace(' ', '')) != -1:
return row['street1']
else:
return row['street1'] + row['street2']
d.apply(lambda row: address_clean(row), axis=1).head()
该代码向我抛出以下错误:
AttributeError: ("'float' object has no attribute 'replace'", 'occurred at index 1')
我想知道我错误地使用了函数的哪一部分,以及如何解决这个错误。
天涯尽头无女友
相关分类