0

I have a pandas dataframe that looks like this

2   zero    zero    zero    zero    zero    zero    zero    2   zero    zero    ... 6   6   zero    [2, 4]  zero    2   zero    zero    zero    zero
3   1   zero    6   1   zero    zero    zero    zero    zero    zero    ... zero    zero    zero    zero    4   zero    zero    5   zero    zero
4   zero    zero    zero    zero    6   zero    zero    [2, 0]  zero    zero    ... zero    zero    zero    zero    zero    zero    zero    zero    zero    zero

each row contains some integers, lists and zero string

I'm trying to replace the 0 inside the list with another value like this one [2,0]. I want to convert it to [2,7].

I tried train['finally'] = train['finally'].map({0:7})

this is how train['finally'] looks like

0    [zero, zero, zero, zero, 2, zero, zero, zero, ...
1    [zero, zero, zero, 3, zero, zero, zero, 4, zer...
2    [zero, zero, zero, zero, zero, zero, zero, 2, ...
3    [1, zero, 6, 1, zero, zero, zero, zero, zero, ...
4    [zero, zero, zero, zero, 6, zero, zero, [2, 0]...
5    [zero, zero, 3, zero, zero, 4, zero, zero, zer...
6    [zero, zero, zero, zero, zero, zero, zero, zer...
7    [zero, zero, zero, zero, [3, 6], zero, zero, z...
8    [zero, [1, 3], zero, zero, zero, zero, zero, z...
9    [zero, zero, 5, zero, zero, 3, zero, 1, 2, [1,...
Name: finally, dtype: object

and I also tried visits_df.replace(0,7)

but they didn't give me the desired result How can I do it?

Thanks in advance

Muhammed Eltabakh
  • 375
  • 1
  • 10
  • 24

1 Answers1

2

df.replace will look for cells that contain that value, and replace it with the target.

In your case, you're dealing with a column of lists, so something a little more aggressive is needed. Let's try astype(str) + str.replace + ast.literal_eval.

import ast

df['finally'] = df['finally'].astype(str)\
         .str.replace('0', '7').apply(ast.literal_eval)

Cast to string, convert, and convert back as needed.


Miniature demo with a python list. The principle remains the same when translated to pandas.

In [52]: data = ['zero', [0, 1, 0, 2], 'zero', 'zero', 1, 0]

In [53]: str(data).replace('0', '7')
Out[53]: "['zero', [7, 1, 7, 2], 'zero', 'zero', 1, 7]"

In [54]: ast.literal_eval(_)
Out[54]: ['zero', [7, 1, 7, 2], 'zero', 'zero', 1, 7]
cs95
  • 379,657
  • 97
  • 704
  • 746