python - (pandas)如何根据三个相似的数据列创建唯一标识符,其中顺序无关紧要?

标签 python pandas uniqueidentifier

(Python/ Pandas ) 我正在对英国房价数据进行一些分析,看看房价是否会对附近学校的质量产生影响。我已将最近的三所学校的 URN(唯一引用号)与每笔房价交易进行了匹配。这些是数据中的 URN_1、URN_2、URN_3 列。

我想估计数据的固定效应模型,其中固定效应基于最近的三所学校。因此,我想为每三所学校的集群创建一个唯一的 ID,并且我希望它不受学校顺序的影响。尽管学校的顺序不同,但属性(property) A 和属性(property) B 应该具有相同的 ID。

Property    URN_1   URN_2   URN_3
A         100053   100052   100054
B         100052   100054   100053

有谁知道如何使用 Python 创建唯一的集群 ID?

我尝试使用 .groupby() 使用下面的代码创建 ID,但是当学校的顺序不同时,这会给出不同的集群 ID。

这是我尝试过的:

import pandas as pd
URN1=[1,2,3,4,5]
URN2=[5,4,3,2,1]
URN3=[1,2,3,2,1]
lst=['a','b','c','d','e']
df=pd.DataFrame(list(zip(URN1,URN2,URN3)),
columns['URN_1','URN_2','URN_3'],index=lst)
df['clusterid']=df.groupby(['URN_1','URN_2','URN_3']).ngroup()
print(df)

我想让观察值“a”和“e”具有相同的簇 ID,但通过此方法为它们赋予不同的 ID。

最佳答案

如果您的数据不太长,则此方法有效:

# we sort the values of each row
# and turn them to tuples
markers = (df[['URN_1','URN_2','URN_3']]
             .apply(lambda x: tuple(sorted(x.values)), axis=1)
          )

df['clisterid'] = df.groupby(markers).ngroup()

输出:

  Property   URN_1   URN_2   URN_3  clisterid
0        A  100053  100052  100054          0
1        B  100052  100054  100053          0
<小时/>

选项 2:由于上述解决方案使用了 apply,这在某些情况下可能并不理想。这里有一个数学小技巧:已知群 (a,b,c)(a+b+c, a**2+ 唯一定义(直到排列) b**2+c**2, abc)。因此我们可以计算这些值并按它们进行分组:

tmp_df = df[['URN_1','URN_2','URN_3']]

s = tmp_df.sum(1)         # sums
sq = (tmp_df**2).sum(1)   # sum of squares
p = tmp_df.prod(1)        # products

# groupby
df['clisterid'] = df.groupby([s,sq,p]).ngroup()

性能:第一种方法需要 14 秒才能处理 200 万行,而第二种方法只需不到 1 秒。

关于python - (pandas)如何根据三个相似的数据列创建唯一标识符,其中顺序无关紧要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56633655/

相关文章:

python - sqlalchemy 连接到服务器,不指定数据库

python - 如何将嵌套数据示例中的两个值抽象到 pandas Dataframe 中?

c++ - 用 C++ 为当前机器生成 GUID 的简单方法是什么?

python - 如何自动构建多个列表

python - 纯Python或itertools按每个日期之间的天数差异对日期列表进行分组

javascript - 我应该如何为一堆对象生成唯一的 ID?

ios - identifierForVendor 是否随应用程序更新而改变?

python - 如何连接 2 个数据框并基于过滤器 pyspark 添加新列

python - 我不小心安装了 64 位和 32 位 python 2.7.8,现在它的行为很奇怪

python - 用三角函数求解非线性方程组