Delete last element from lists in column of data frame based on other column value

Viewed 35

I have a dataframe df like this:

 col1  col2 col3               col4                col5      
  Type Key Date first found    Date last found     Images
0  A     1 2020-08-11 07:28:18 2020-08-11 07:28:18 ['image1', 'image2, 'image3']
1  A     2 2020-08-11 07:28:18 2020-08-12 07:28:18 ['image1', 'image2, 'image3']
2  B     3 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
3  B     4 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
4  C     5 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']

What I would like to do is to delete the last element 'image3' if Type is 'A'. Expected result:

 col1  col2 col3               col4                col5      
  Type Key Date first found    Date last found     Images
0  A     1 2020-08-11 07:28:18 2020-08-11 07:28:18 ['image1', 'image2]
1  A     2 2020-08-11 07:28:18 2020-08-12 07:28:18 ['image1', 'image2]
2  B     3 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
3  B     4 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']
4  C     5 2020-08-11 07:28:18 2020-08-13 07:28:18 ['image1', 'image2, 'image3']

I've tried without success:

del df.loc[df["Type"] == 'A']['Images'][:-1]

and

df.loc[df["Type"] == 'A']['Images'] = df.loc[df["Type"] == 'A']['Images'].pop()
2 Answers

Try using str accessor:

df.loc[df["Type"] == 'A', 'Images'] = df['Images'].str[:-1]

For speed best is use mask for both sides (for processing only filtered rows, not all rows like another answer) and in variable for prevent double compare, for select is used str working with iterables, so here with lists:

mask = df["Type"] == 'A'
df.loc[mask, 'Images'] = df.loc[mask, 'Images'].str[:-1]
Related