3

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

I've tried using the replace method, but for some reason it replaces with the first integer of the list only, instead of both

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 have tried replacing with the Cartesian coords as strings, and afterwards converting the string to integer lists and it worked, but since I'm new to python and pandas I'm guessing there is a simpler way using replace but there is something basic I'm missing which I just can't seem to figure out.

  • I've also tried this syntax with the same results:

    df.ix[:,0].replace(to_replace = chess_dict.keys(), value = chess_dict.values(), inplace=True)
    
  • I've also tried using integer tuples for the Cartesian coords (0,0), (0,1), etc., but now only the last instead of first value is inserted in the DataFrame column

    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
    

1 Answer 1

3

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.