将 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)]
我有两个 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)]