我在df中有一列,其中充满了像["1120", "2230", "1120", "1234" ...]
这样的字符串
并非该列中的每个值都是唯一的。
我想将这些字符串转换为从0到N的序列号,其中N是该列中唯一值的数量,以便我可以对此数据进行散点图绘制。仅更改列的类型不足以完成此任务。任何指导是非常感谢。我尝试使用伪变量,但真的不知道从哪里开始。
答案 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)
以获得所需的数字。