行函数上的 Pandas 列字符串方法

我正在尝试使用字符串方法根据其他三个列的条件计算一个新列。


样本数据:


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,则忽略

  • 否则,连接street1street2

我试过的:

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

我想知道我错误地使用了函数的哪一部分,以及如何解决这个错误。


Cats萌萌
浏览 157回答 1
1回答

天涯尽头无女友

在一系列中搜索模式很容易,但我必须使用它apply来查找列是否以另一列的内容结尾。顺便说一句,我不得不稍微更改您的数据,因为除非要忽略空格'...suite101','suite 101'否则不会以结尾。所以我使用了:d = pd.DataFrame({'street1': ['1000 foo dr', '1001 bar dr', '1002 foo dr suite 101', '1003 bar dr'],                  'street2': ['city_a', np.nan, 'suite 101', 'suite 102'],                  'city': ['city_a', 'city_b', np.nan, 'city_c']})print(pd.DataFrame({'Address': np.where(d.street2.str.contains('city', na=True)               | d.apply(lambda x: x.street1.endswith(str(x.street2)), axis = 1),               d.street1,               d.street1.str.cat(d.street2, sep=' '))}))按预期给出:                 Address0            1000 foo dr1            1001 bar dr2  1002 foo dr suite 1013  1003 bar dr suite 102
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python