如何在熊猫中将字符串列转换为连续数字?

时间:2020-05-30 15:12:11

标签: python pandas

我在df中有一列,其中充满了像["1120", "2230", "1120", "1234" ...]这样的字符串 并非该列中的每个值都是唯一的。

我想将这些字符串转换为从0到N的序列号,其中N是该列中唯一值的数量,以便我可以对此数据进行散点图绘制。仅更改列的类型不足以完成此任务。任何指导是非常感谢。我尝试使用伪变量,但真的不知道从哪里开始。

2 个答案:

答案 0 :(得分:3)

只需使用.unique().reset_index()从字符串到顺序ID的查询表中,然后再.join()表:

df = pd.DataFrame(["1120", "2230", "1120", "1234"], columns=["num"])
sequential = pd.Series(df["num"].unique()).reset_index().rename(columns={0: "num"})
df.merge(sequential, on="num")

编辑:

如果要先按数字字符串的整数值排序,则可以添加以下代码行进行排序(在创建顺序系列之前):

df["num"] = df["num"].astype("int").sort_values().reset_index(drop=True)

答案 1 :(得分:0)

您可以破解-我还不足以为您提供纯熊猫的实现,但这可能会起作用:

import pandas as pd

# prepare demo df
df = pd.DataFrame({"nums" : ["1120", "2230", "1120", "1234","9999","9"]}) 

# map(int, ...) needed for numeric sorting instead of lexicographical sorting
s = {str(v):i for i,v in enumerate(sorted(set(map(int, df["nums"]))))}

df["ReIndex"] = [s[key] for key in df["nums"]] 
print(df) 

输出:

   nums  ReIndex
0  1120        1
1  2230        3
2  1120        1
3  1234        2
4  9999        4
5     9        0

您可以删除df["nums"]df.rename(columns = {'ReIndex':'nums'}, inplace = True)以获得所需的数字。