为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Cats萌萌 2021-12-16 16:03:39
我正在尝试使用字符串方法根据其他三个列的条件计算一个新列。样本数据: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     city1000 foo dr             city_a      city_a1001 bar dr             NaN         city_b1002 foo dr suite101    suite 101   NaN1003 bar dr             suite 102   city_c理想输出:Address1000 foo dr1001 bar dr1002 foo dr suite 1011003 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')我想知道我错误地使用了函数的哪一部分,以及如何解决这个错误。
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

在一系列中搜索模式很容易,但我必须使用它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=' '))}))

按预期给出:


                 Address

0            1000 foo dr

1            1001 bar dr

2  1002 foo dr suite 101

3  1003 bar dr suite 102


查看完整回答
反对 回复 2021-12-16
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号