我想将包含国际象棋方形坐标的3列大熊猫数据框 df 替换为字符串,使用字典 chess_dict 以2x1的形式将它们映射到笛卡尔坐标整数列表。
我尝试过使用替换方法,但出于某种原因,它只替换了列表的第一个整数,而不是两个
例如。 ('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
...
我尝试用笛卡尔坐标作为字符串替换,然后将字符串转换为整数列表并且它有效,但是因为我是python和pandas的新手我猜测有一种更简单的方法使用替换但有一些基本的我不知道,我似乎无法弄明白。
我也尝试过这种语法,结果相同:
df.ix[:,0].replace(to_replace = chess_dict.keys(), value = chess_dict.values(), inplace=True)
我也尝试使用整数元组作为笛卡尔坐标(0,0),(0,1)等,但现在只在数据框列中插入了最后一个而不是第一个值
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
答案 0 :(得分:2)
选项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
选项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