Python 转换整个数据帧';将s值转换为唯一整数以进行fisher';s检验

Python 转换整个数据帧';将s值转换为唯一整数以进行fisher';s检验,python,pandas,Python,Pandas,我想将我的字符串值更改为整个数据帧的唯一整数ID,这是我想做的简化版本。真正的一个有20+列和100000+行。我需要将其转换为每行执行fisher测试,这需要区分唯一整数,以查看列组之间的差异 Xcol1 col2 col3 10/01/10/0 20/20/01/1 31/20/21/1 40/0/0/0 到 Xcol1 col2 col3 112 1 23 1 2 34 3 2 41 尝试进行因式分解,但无法解决如何对这样的整个数据帧执行此操作,只能对具有以下代码的列执行此操作:df=df

我想将我的字符串值更改为整个数据帧的唯一整数ID,这是我想做的简化版本。真正的一个有20+列和100000+行。我需要将其转换为每行执行fisher测试,这需要区分唯一整数,以查看列组之间的差异

Xcol1 col2 col3

10/01/10/0

20/20/01/1

31/20/21/1

40/0/0/0

Xcol1 col2 col3

112 1

23 1 2

34 3 2

41

尝试进行因式分解,但无法解决如何对这样的整个数据帧执行此操作,只能对具有以下代码的列执行此操作:df=df.apply(lambda x:pd.factorize(x)[0])


同样的工作是只按每行解析的数据来处理每行数据。

使用
df.rank
method='dense'
。每个唯一的字符串将被分配一个唯一的编号/等级

df_final = df.set_index('X').rank(method='dense').astype(int)

Out[244]:
   col1  col2  col3
X
1     1     3     1
2     2     1     2
3     3     2     2
4     1     1     1
试试这个:

df = pd.DataFrame([['0/0', '1/1', '0/0'], ['0/2', '0/1', '1/1'], ['1/2', '0/2', '1/1'], ['0/0', '0/0', '0/0']])

d = {n:m for m, n in enumerate(list(set([j for i in df.values.tolist() for j in i])))}

df_new = df.replace(d)
输入:

     0    1    2
0  0/0  1/1  0/0
1  0/2  0/1  1/1
2  1/2  0/2  1/1
3  0/0  0/0  0/0
输出:

   0  1  2
0  2  4  2
1  1  3  4
2  0  1  4
3  2  2  2

您可以使用apply函数这样做

df = pd.DataFrame([['0/0', '1/1', '0/0'], ['0/2', '0/0', '1/1'], ['1/2', '0/2', '1/1'], ['0/0', '0/0', '0/0']], columns=('col1', 'col2', 'col3'))

df2 = df.apply(lambda s: [sum(map(int,x.split("/"))) for x in s])
df2[df2==0] = 1
df2
结果

 col1  col2  col3
0     1     2     1
1     2     1     2
2     3     2     2
3     1     1     1

所以对整个数据帧使用
applymap