4

I have a small dataframe and am trying to remove the url from the end of the string in the Links column. I have tried the following code and it works on columns where the url is on its own. The problem is that as soon as there are sentences before the url the code won't remove those urls

Here is the data: https://docs.google.com/spreadsheets/d/10LV8BHgofXKTwG-MqRraj0YWez-1vcwzzTJpRhdWgew/edit?usp=sharing (link to spreadsheet)

import pandas as pd  

df = pd.read_csv('TestData.csv')    

df['Links'] = df['Links'].replace(to_replace=r'^https?:\/\/.*[\r\n]*',value='',regex=True)

df.head()

Thanks!

Joe Smith
  • 63
  • 1
  • 1
  • 4
  • 2
    Please do not use links to third-party sites. Include _as much relevant data as necessary_ in your question. Also, include the expected results. – DYZ Aug 23 '18 at 21:07
  • just remove the `^` part which fixes the starting point of the sentence. That will fix your issue – Onyambu Aug 23 '18 at 21:49
  • @Onyambu thanks that was all that was needed. – Joe Smith Aug 24 '18 at 13:19
  • Does this answer your question? [Remove a URL row by row from a large set of text in python panda dataframe](https://stackoverflow.com/questions/45395676/remove-a-url-row-by-row-from-a-large-set-of-text-in-python-panda-dataframe) – Abu Shoeb Sep 09 '20 at 22:26

3 Answers3

8

Try a cleaner regex:

df['example'] = df['example'].replace(r'http\S+', '', regex=True).replace(r'www\S+', '', regex=True)

Before implementing regex in pandas .replace() or anywhere else for that matter you should test the pattern using re.sub() on a single basic string example. When faced with a big problem, break it down into a smaller one.

Additionally we could go with the str.replace method:

df['status_message'] = df['status_message'].str.replace('http\S+|www.\S+', '', case=False)
Philip DiSarro
  • 1,007
  • 6
  • 9
  • The accepted answer by OP does not work for me (deletes everything after the URL as well). Your suggestion works better, removing only URLs and keeping the rest. – PretendNotToSuck Sep 27 '22 at 07:28
8

Try this:

import re
df['cleanLinks'] = df['Links'].apply(lambda x: re.split('https:\/\/.*', str(x))[0])

Output:

df['cleanLinks']

    cleanLinks
0   random words to see if it works now 
1   more stuff that doesn't mean anything 
2   one last try please work 
Vishnu Kunchur
  • 1,716
  • 8
  • 9
  • I came across this thread today and tried out this solution. For me, this just keeps the string before the URL, but deletes everything after. So if you have a cell with an URL in the middle, this does not work. – PretendNotToSuck Sep 27 '22 at 07:25
1

For Dataframe df, URLs can be removed by using cleaner regex as follows:

df = pd.read_csv('./data-set.csv')
print(df['text'])

def clean_data(dataframe):
#replace URL of a text
    dataframe['text'] = dataframe['text'].str.replace('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', ' ')

clean_data(df)
print(df['text']);
Isurie
  • 310
  • 4
  • 9