【问题标题】:Converting pandas df column of values to uniqueidentifiers将pandas df列值转换为uniqueidentifiers
【发布时间】:2021-11-03 13:37:23
【问题描述】:

我有两个看起来像这样的熊猫数据框:

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'] 中的条目转换为等于/小于12 个字符的唯一ID,并对具有匹配唯一ID 的df2['node_id'] 执行相同的操作.

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

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

【问题讨论】:

  • 为什么node_id是df1中的一个列表?还有列表中的值是什么,它们是字符串吗?
  • 不知道为什么。但可以使用df['node_id'] = df['node_id'].apply(lambda x: x[0]) 进行转换。第二,列表中的值是字符串。

标签: python pandas function uniqueidentifier


【解决方案1】:

这种听起来像是哈希函数可以做的事情,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)]

【讨论】:

  • 哈希函数不会创建类似'0394a2ede332c9a13eb8' 的条目吗?如果这些 id 可以像 'AAAA_001' 那样更具可读性,我会很高兴
  • LabelEncoder 可能很有用。例如,也许我可以生成数字,然后将它们作为字符串放在'AA_' 旁边。顺便说一句@Anton,如果您出于文档原因添加 sklearn 示例,那就太好了!
猜你喜欢
  • 2022-11-29
  • 2016-09-26
  • 2016-09-17
  • 2019-12-31
  • 2018-11-30
  • 2017-05-17
  • 1970-01-01
  • 2019-05-30
  • 2021-10-16
相关资源
最近更新 更多