gpt4 book ai didi

python - 为 pandas 数据框中两列的每个精确匹配创建一个具有随机数的列

转载 作者:行者123 更新时间:2023-12-01 04:20:44 24 4
gpt4 key购买 nike

我正在尝试创建一个 NEW_ID 列,其中每个完全匹配的 FIRST_NMLAST_NM 都具有唯一值。

data = np.array([['John', 'Smith', 1], ['John', 'West', 7], ['Eric', 'Adams', 9], 
['Jane', 'Doe', 14], ['Jane', 'Doe', 16], ['John', 'Smith', 19]])

df = pd.DataFrame(data, columns=['FIRST_NM', 'LAST_NM', 'PAGE_NUM'])

FIRST_NM LAST_NM PAGE_NUM
0 John Smith 1
1 John West 7
2 Eric Adams 9
3 Jane Doe 14
4 Jane Doe 16
5 John Smith 19

所需的数据框:

  FIRST_NM LAST_NM PAGE_NUM  NEW_ID
0 John Smith 1 654
1 John West 7 123
2 Eric Adams 9 78
3 Jane Doe 14 3
4 Jane Doe 16 3
5 John Smith 19 654

我想我应该做类似下面代码的事情,但我知道这是不对的......

import random
df.groupby(['FIRST_NM', 'LAST_NM']).apply(lambda group: random.getrandbits(16))

最佳答案

如果您使用transform,您的原始版本将会工作,它将结果广播回原始索引:

>>> df["NEW_ID"] = df.groupby(['FIRST_NM', 'LAST_NM']).transform(lambda group: 
random.getrandbits(16))
>>> df
FIRST_NM LAST_NM PAGE_NUM NEW_ID
0 John Smith 1 57757
1 John Smith 7 57757
2 Eric Adams 9 46139
3 Jane Doe 14 55091
4 Jane Doe 16 55091
5 John Smith 19 57757

但我不太热衷于只获取随机数并希望得到最好的结果(即没有冲突)。如果您有一个像您的示例一样的类似范围的索引,您可以使用它:

>>> df.groupby(['FIRST_NM', 'LAST_NM'])["PAGE_NUM"].transform("idxmin")
0 0
1 0
2 2
3 3
4 3
5 0
dtype: int64

或者排名版本:

>>> df.groupby(['FIRST_NM', 'LAST_NM'])["PAGE_NUM"].transform("idxmin").rank("dense")
0 1
1 1
2 2
3 3
4 3
5 1
dtype: float64

一旦你有了这些,你就可以按照你喜欢的方式将它们安全地映射到唯一的随机数中。

<小时/>

不幸的是,我不认为小组作业所在的唯一位置是有保证的,即

>>> grouped = df.groupby(["FIRST_NM", "LAST_NM"])
>>> grouped.grouper.group_info[0]
array([2, 2, 0, 1, 1, 2], dtype=int64)

我不介意 groupcount() 方法返回此版本或“按首次出现顺序排名”版本。

关于python - 为 pandas 数据框中两列的每个精确匹配创建一个具有随机数的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com