我想将整个数据帧的字符串值更改为唯一的整数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])。
同样的工作是按照解析的每一行来做。
答案 0 :(得分:1)
将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
答案 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