熊猫:使用带有很多值的str.contains

时间:2016-07-22 15:36:05

标签: python pandas

我有df,我需要使用str.contains,但我有很多条件,而且df1。 我试试

df2[df2['url'].str.contains[df3['buys']]]但它会返回

TypeError: 'instancemethod' object has no attribute '__getitem__' 怎么了?

df2看起来像

                                                     url                  used_at  \
0      eldorado.ru/personal/order.php?step=confirm&Cu...  2016-04-01 00:16:46   
1      eldorado.ru/personal/order.php?step=confirm&Cu...  2016-04-01 00:19:56   
2      shoppingcart.aliexpress.com/order/confirm_orde...  2016-04-01 00:29:17   
3      shoppingcart.aliexpress.com/order/confirm_orde...  2016-04-01 00:29:43   
4      icashier.alipay.com/payment/payment-result.htm...  2016-04-01 00:30:11   
5      shoppingcart.aliexpress.com/order/confirm_orde...  2016-04-01 00:31:11   
6      icashier.alipay.com/payment/payment-result.htm...  2016-04-01 00:31:27   
7                  kupivip.ru/shop/checkout/confirmation  2016-04-01 00:49:13   
8                  kupivip.ru/shop/checkout/confirmation  2016-04-01 00:49:37   
9      lk.wildberries.ru/basket/orderconfirmed?orderI...  2016-04-01 01:25:25

df3看起来像

buy
shoppingcart.aliexpress.com/order/confirm_order
ozon.ru?context=order_done
lk.wildberries.ru/basket/orderconfirmed
lamoda.ru/checkout/onepage/success/quick
mvideo.ru/homeshop/order.php
eldorado.ru/personal/order.php?step=confirm
ulmart.ru/checkout/confirm
checkout.payments.ebay.com/*pagename=success
svyaznoy.ru/cart/order/created

2 个答案:

答案 0 :(得分:1)

你需要括号:

df2[df2['url'].str.contains(df3['buys'])]

错误

TypeError: 'instancemethod' object has no attribute '__getitem__'

表示你在一个不知道如何处理方括号的对象后使用方括号。

当你使用方括号时,python使用方括号在对象上调用方法__getitem__。在这种情况下,str.contains[]。你应该用括号str.contains()来调用它。

问题2

这应该有助于您到达您需要的地方。请记住,您可能需要对此进行调整。而且,这是超级黑客。

matches = pd.DataFrame([], df2.url, df3.buy).apply(lambda x: x.index.str.contains(x.name)).stack()
matches[matches].index.levels[0]

Index([u'eldorado.ru/personal/order.php?step=confirm&Cu...',
       u'icashier.alipay.com/payment/payment-result.htm...',
       u'kupivip.ru/shop/checkout/confirmation',
       u'lk.wildberries.ru/basket/orderconfirmed?orderI...',
       u'shoppingcart.aliexpress.com/order/confirm_orde...'],
      dtype='object', name=u'url')

答案 1 :(得分:0)

IIUC你可以传递加入内容的正则表达式:

In [180]:
df = pd.DataFrame({'a':['hello','world','python']})
df1 = pd.DataFrame({'a':['hello','johnny']})
df[df['a'].str.contains('|'.join(df1['a']))]

Out[180]:
       a
0  hello

所以在你的情况下:

df2[df2['url'].str.contains('|'.join(df3['buys']))]

应该有效

在这里,我展示了join

的结果
In [182]:
'|'.join(df1['a'])

Out[182]:
'hello|johnny'