将 pandas df 值列转换为唯一标识符

Converting pandas df column of values to uniqueidentifiers

我有两个 pandas 数据框,如下所示:

df1
            node_id        lat       long
0      [INET_N_855]  53.017810  23.896413
1     [INET_N_1828]  52.984994  22.241386
2      [INET_N_329]  52.881484  20.619795
3     [INET_N_1612]  46.505528  13.592806
4     [INET_N_1009]  46.503733  13.416054
...             ...        ...        ...
4670  [SEQ_12031_p]  49.697490  12.328040
4671      [NO_N_30]  59.272825   5.519794
4672   [INET_N_379]  35.828836  14.556524
4673  [INET_N_1287]  61.638170  21.398810
4674      [Prod_33]  64.982320   6.611590
[4675 rows x 3 columns]

df2
                         node_id  ...                    long
0      [INET_N_855, INET_N_1828]  ...  [23.896413, 22.241386]
1      [INET_N_1828, INET_N_329]  ...  [22.241386, 20.619795]
2     [INET_N_1612, INET_N_1009]  ...  [13.592806, 13.416054]
3     [INET_N_1612, INET_N_1009]  ...  [13.592806, 13.416054]
4     [INET_N_1612, INET_N_1009]  ...  [13.592806, 13.416054]
...                          ...  ...                     ...
6318    [SEQ_6435_p, INET_N_379]  ...   [13.88715, 14.556524]
6319  [N_14_M_LMGN, INET_N_1287]  ...    [23.08042, 21.39881]
6320      [SEQ_12356_p, Prod_33]  ...     [6.755214, 6.61159]
6321  [N_261_M_LMGN, SEQ_2566_p]  ...    [25.34835, 25.25854]
6322  [N_261_M_LMGN, SEQ_2566_p]  ...    [25.34835, 25.25854]
[6323 rows x 3 columns]

df2'node_id'df1'node_id' 中的项目组成。遗憾的是 'node_id' 中的某些项目太长了。因此,'node_id'中的这些列表项应缩短为等于或小于12个字符,以便输入模拟程序。

为了实现这一点,我需要一个 unique_identifier_generator(df1, df2) 函数,它将 df1['node_id'] 中的条目转换为一些唯一的 ID equal/less,而不是 12 个字符,并且也做同样的事情到 df2['node_id'] 与匹配的唯一 ID。

我想我可以完成 pandas 元素更改部分。但是,我不知道如何创建 unique_identifier_generator 函数。

你知道用什么吗?或者我应该检查什么 python-package?或者也许是一种从给定字符串或给定 pandas 系列生成唯一 ID 的简单方法?

这种听起来像是哈希函数可以做的事情,python hashlib doc 中有很多这样的东西 但是你应该选择一个没有高碰撞弱点的

除此之外,您可以查看 LabelEncoder from sklearn 这可能更容易,因为那里不应该发生碰撞

添加 id 的基本示例:

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder().fit(df.node_id)
df["id"] = encoder.transform(df.node_id)

id 可以转换为字符串或类似的东西,但在某些情况下 int 可能更有用

转换为 str 可能如下所示:

df["id"] = [f"node_{id}" for id in encoder.transform(df.node_id)]