Stata-style replace in Python

In Stata, I can perform a conditional replace using the following code:

replace target_var = new_value if condition_var1 == x  condition_var2 == y

What's the most pythonic way to reproduce the above on a pandas dataframe? Bonus points if I can throw the new values, and conditions into a dictionary to loop over.

To add a bit more context, I'm trying to clean some geographic data, so I'll have a lot of lines like

replace county_name = new_name_1 if district == X_1 and city == Y_1
....
replace county_name = new_name_N if district == X_N and city == Y_N

What I've found so far:

  1. pd.replace which lets me do stuff like the following, but doesn't seem to accept logical conditions:

`

replacements = {   1: 'Male',   2: 'Female',   0: 'Not Recorded' }

df['sex'].replace(replacements, inplace=True)

`

Topic stata pandas python

Category Data Science


df.where(condition, replacement, inplace=True)

Condition is assumed to be boolean Series/Numpy array. Check out where documentation - here is an example.


Maybe you can use the nested dictionary combined with a simple Pandas condition to do this. To show you what I mean, let's take a look at the following example:

test = [ {'Account': 'Jones', 'City': 'Paris'},
         {'Account': 'Alpha',  'City': 'Rome'} ,
         {'Account': 'Jack',  'City': 'Paris'},
         {'Account': 'Rose',  'City': 'Berlin'},
         {'Account': 'Cassandra',  'City': 'London'}]

df = pd.DataFrame(test)
df
    Account City
0   Jones   Paris
1   Alpha   Rome
2   Jack    Paris
3   Rose    Berlin
4   Cassandra   London

Let's say you want to replace the the City Paris to Barcelona only if Account name is Jones (co. You can achieve this easily in two steps:

1) Construct your desired replacement dictionary for the City (one condition):

condition={'City': {'Paris': 'Barcelona'}}

2) Filter down your pandas column where you want the change (second condition)

df[df['Account']=='Jones'].replace(condition)

Which you yield you:

    Account City
0   Jones   Barcelona

I can imagine there will many different ways this can be done, but for I thought of this. ;-)

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.