So, I'm a beginner to Pandas and I'm having a little trouble getting something to work.
My task is that I was given a dataframe as follows:
AnimalID | Pet Name | Pet Type |
---|---|---|
1 | Whiskers | Cat |
2 | Charlie | Dog |
3 | Spot | Dog |
4 | Honey | Cat |
What I'm attempting to do is add a ' ' symbol to the end of the ID if the pet type is a dog.
My solution was to iterate through each row using iterrows() and check if the Pet Type Matches, and if it does, change the ID in that row. My code is below:
import pandas as pd
#df = pd.read_excel('AnimalList.xlsx')
df = pd.DataFrame({'AnimalID':[1,2,3,4], 'Pet Name':['Whiskers', 'Charlie', 'Spot', 'Honey'], 'Pet Type':['Cat', 'Dog', 'Dog', 'Cat']})
for row in df.iterrows():
if row['Pet Type'].eq('Dog').any():
row['AnimalID'] = df['AnimalID'].astype(str) ' '
df
The dataframe is printing without error, but is there any reason that nothing is changing? I have to be missing something obvious. Thank you.
CodePudding user response:
You can apply Series.where
to column AnimalID
. Its values will be replaced where the condition is False
, so we will need to check Series.ne
to add
for each row where this column equals Dog
.
df['AnimalID'] = df['AnimalID'].where(df['Pet Type'].ne('Dog'),
df['AnimalID'].astype(str) ' ')
print(df)
AnimalID Pet Name Pet Type
0 1 Whiskers Cat
1 2 Charlie Dog
2 3 Spot Dog
3 4 Honey Cat
CodePudding user response:
here is one way to do it using mask
# when condition is true, add to the ID
df['AnimalID']=(df['AnimalID'].mask(df['Pet Type'].eq('Dog'),
df['AnimalID'].astype(str) (' ')))
df
AnimalID Pet Name Pet Type
0 1 Whiskers Cat
1 2 Charlie Dog
2 3 Spot Dog
3 4 Honey Cat