如何将列的所有值更改为唯一整数?

2024-06-02 09:13:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个国际象棋数据集,在那里我得到了一个关于移动1、移动2、移动3等的列。。。 每一列都有玩家制作的“游戏代码”。每一行是针对一个特定的游戏,大约有1000行

  result move_1 move_2 move_3 ...
      1     e4     d4    Nc3  ...    
      1     d4    Nf3     c4  ...
      1     e4     d3    Nd2  ...
      1     d4     c4     d5  ...
      0     d4     c4    Nc3  ...

keeps going down...

对于我来说,将每行/每列中的每个唯一值更改为指定整数以便对其进行分析的最佳方法是什么? 我已经做了以下工作:

chess_df['move_2'].replace(to_replace=['Nf3', 'c4', 'd3','d4', 'Nc3'],
           value= [3, 2, 4, 1, 7],
           inplace=True)

其中每个“播放代码”都指定了整数。因此,在所有行上,'d4'=1,'c4=2等等

问题是,这不是一个很好的方法,因为我需要找到每个唯一的代码,并用列替换为唯一的整数。。。这需要很长时间,而且会让人很困惑

我想要的是,move_1列有1000行和45个唯一的“播放代码”。因此,其中的每个播放代码都将变成一个介于1-45之间的数字

move_2列有1000行,其中有89个唯一值,其中25个也在move_1列中。因此,我需要分配move_1列中已分配的25个编号+64新编号。等等

所以我的问题是:

我怎样才能通过Python代码创建一些东西,自动将所有行和列上的“播放代码”更改为唯一整数的过程?


Tags: 数据方法代码游戏move整数replace编号
3条回答

这就是我的方法:

import pandas as pd
df = pd.DataFrame({'Move_1':['a1','b2','c3','c4'],
                   'Mode_2':['a1','f5','h6','b2']})

replacers = {k:list(set([x[0] for x in df.values.reshape(-1,1)])).index(k) for k in list(set([x[0] for x in df.values.reshape(-1,1)]))}
df_new = df.replace(replacers)

输出:

   Move_1  Mode_2
0       0       0
1       5       3
2       1       4
3       2       5

从本质上说,我们正在创建一个字典,其中国际象棋的位置作为键,唯一的数字作为值。然后将在df.replace()中使用它来对df中的所有值执行替换

这有用吗

unique_vals = chess_df['move_2'].unique()
chess_df['move_2'].replace(to_replace=unique_vals,
           value= list(range(len(unique_vals))),
           inplace=True)

一个简单的替代方法是将所有内容堆叠到一个系列中,对其进行排序,然后取消堆叠。这样,秩将应用于整个数据帧。这里“d4”变成6,不管它发生在哪里

df.filter(like='move_').stack().rank(method='dense').atype(int).unstack()
#   move_1  move_2  move_3
#0       8       6       1
#1       6       3       4
#2       8       5       2
#3       6       4       7
#4       6       4       1

或者,您可以使用np.uniquereturn_inverse参数重新创建数据帧

arr = df.filter(like='move')
pd.DataFrame(np.unique(arr, return_inverse=True)[1].reshape(arr.shape),
             index=arr.index,
             columns=arr.columns)

#   move_1  move_2  move_3
#0       7       5       0
#1       5       2       3
#2       7       4       1
#3       5       3       6
#4       5       3       0

相关问题 更多 >