(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/