Replace values ​​in Pandas DataFrame column with whole lists / tuples

I want to replace 3 columns of a pandas dataframe df containing square chess coordinates as strings using a chess_dict dictionary to map them to cartesian coordinates in the form of 2x1 integer lists.

I tried using the replace method , but for some reason it only replaces the first integer of the list and not

eg. ('a1', 'h6') β†’ ([0,0], [7,5])

>>>chess_dict
 {'a1': [0, 0],
 'a2': [0, 1],
 ...
 'h5': [7, 4],
 'h6': [7, 5],
 'h7': [7, 6],
 'h8': [7, 7]}

>>>df
      WK  WR  BK plays outcome
0     h4  e6  a4     b       w
1     a6  h4  g8     w       w
2     f5  a3  d1     w       w
3     c2  h3  f5     w       w
...
>>>df.ix[:,0].replace(chess_dict, inplace=True)
>>>df.ix[:,1].replace(chess_dict, inplace=True)
>>>df.ix[:,2].replace(chess_dict, inplace=True)
>>>df
      WK  WR  BK plays outcome
0      7   4   0     b       w
1      5   3   7     w       w
2      5   0   3     w       w
3      1   2   4     w       w
...

      

  • I tried replacing with cartesian coordinates as strings and then converting the string to whole lists and it worked, but since I'm new to python and pandas, I guess there is an easier way using replace , but there is something basic that I don't see. which I just can't figure out.

  • I have also tried this syntax with the same results:

    df.ix[:,0].replace(to_replace = chess_dict.keys(), value = chess_dict.values(), inplace=True)
    
          

  • I also tried to use integer tuples for cartesian coordinates (0,0), (0,1), etc., but now only the last value is inserted in the DataFrame column instead of the first value

    WK  WR  BK plays outcome
    0      3  g7  b4     b       w
    1      3  h7  d1     b       w
    2      3  h6  f5     w       w
    3      6  d5  b1     b       w
    
          

+3


source to share


1 answer


option 1

chess_dict = {
    r + c: [i, j]
        for i, r in enumerate(list('abcdefgh'))
        for j, c in enumerate(list('12345678'))
}

df.iloc[:, :3].stack().map(chess_dict).unstack().join(df.iloc[:, 3:])

       WK      WR      BK plays outcome
0  [7, 3]  [4, 5]  [0, 3]     b       w
1  [0, 5]  [7, 3]  [6, 7]     w       w
2  [5, 4]  [0, 2]  [3, 0]     w       w
3  [2, 1]  [7, 2]  [5, 4]     w       w

      



option 2

df.applymap(lambda x: chess_dict.get(x, x))

       WK      WR      BK plays outcome
0  [7, 3]  [4, 5]  [0, 3]     b       w
1  [0, 5]  [7, 3]  [6, 7]     w       w
2  [5, 4]  [0, 2]  [3, 0]     w       w
3  [2, 1]  [7, 2]  [5, 4]     w       w

      

+2


source







All Articles