将整个数据框的值转换为唯一的整数以进行费舍尔测试

时间:2019-10-17 02:38:58

标签: python pandas

我想将整个数据帧的字符串值更改为唯一的整数IDS,这是我想要做的简化版本。真正的一个有20多个列和100,000多个行。我需要将其转换为每行进行一次费舍尔测试,这需要区分唯一整数以查看列组之间的差异。

X col1 col2 col3

1 0/0 1/1 0/0

2 0/2 0/0 1/1

3 1/2 0/2 1/1

4 0/0 0/0 0/0

X col1 col2 col3

1 1 2 1

2 3 1 2

3 4 3 2

4 1 1 1

试图进行分解,但无法弄清楚如何对整个数据框执行此操作,只能对具有以下代码的列执行此操作:df = df.apply(lambda x:pd.factorize(x )[0])。

同样的工作是按照解析的每一行来做。

3 个答案:

答案 0 :(得分:1)

df.rankmethod='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

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

您可以使用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