noblerthanoedipus
noblerthanoedipus

Reputation: 516

Split and Join Series in Pandas

I have two series in the dataframe below. The first is a string which will appear in the second, which will be a url string. What I want to do is change the first series by concatenating on extra characters, and have that change applied onto the second string.

import pandas as pd
#import urlparse

d = {'OrigWord' : ['bunny', 'bear', 'bull'], 'WordinUrl' : ['http://www.animal.com/bunny/ear.html', 'http://www.animal.com/bear/ear.html', 'http://www.animal.com/bull/ear.html'] }

df = pd.DataFrame(d)

def trial(source_col, dest_col):
    splitter = dest_col.str.split(str(source_col))
    print type(splitter)
    print splitter
    res = 'angry_' + str(source_col).join(splitter)
    return res

df['Final'] = df.applymap(trial(df.OrigWord, df.WordinUrl))

I'm trying to find the string from the source_col, then split on that string in the dest_col, then effect that change on the string in dest_col. Here I have it as a new series called Final but I would rather inplace. I think the main issue are the splitter variable, which isn't working and the application of the function.

Here's how result should look:

      OrigWord                                   WordinUrl
  angry_bunny  http://www.animal.com/angry_bunny/ear.html
  angry_bear   http://www.animal.com/angry_bear/ear.html
  angry_bull   http://www.animal.com/angry_bull/ear.html

Upvotes: 1

Views: 1370

Answers (3)

MaxU - stand with Ukraine
MaxU - stand with Ukraine

Reputation: 210852

here is an alternative approach:

df['WordinUrl'] = (df.apply(lambda x: x.WordinUrl.replace(x.OrigWord,
                                                          'angry_' + x.OrigWord), axis=1))

In [25]: df
Out[25]:
  OrigWord                                   WordinUrl
0    bunny  http://www.animal.com/angry_bunny/ear.html
1     bear   http://www.animal.com/angry_bear/ear.html
2     bull   http://www.animal.com/angry_bull/ear.html

Upvotes: 1

akuiper
akuiper

Reputation: 214987

Instead of using split, you can use the replace method to prepend the angry_ to the corresponding source:

def trial(row):
    row.WordinUrl = row.WordinUrl.replace(row.OrigWord, "angry_" + row.OrigWord)
    row.OrigWord = "angry_" + row.OrigWord
    return row

df.apply(trial, axis = 1)

    OrigWord    WordinUrl
0   angry_bunny http://www.animal.com/angry_bunny/ear.html
1   angry_bear  http://www.animal.com/angry_bear/ear.html
2   angry_bull  http://www.animal.com/angry_bull/ear.html

Upvotes: 1

Yarnspinner
Yarnspinner

Reputation: 882

apply isn't really designed to apply to multiple columns in the same row. What you can do is to change your function so that it takes in a series instead and then assigns source_col, dest_col to the appropriate value in the series. One way of doing it is as below:

def trial(x):
    source_col = x["OrigWord"]
    dest_col = x['WordinUrl' ]
    splitter = str(dest_col).split(str(source_col))
    res = splitter[0] + 'angry_' + source_col + splitter[1]
    return res


df['Final'] = df.apply(trial,axis = 1 )

Upvotes: 2

Related Questions