在 pandas 中条件值的行之间成对计算 similarity/distance
Calculate pairwise similarity/distance between rows with conditional values in pandas
我正在尝试计算共享一个类别的行中值之间的距离。对于user_id1个参数1,1和7之间的距离Par 2 10、20之间的距离。
df1 = pd.DataFrame({"user_id":[1,2,1,2], "Par1":[1, 3, 7,9], "Par2":[10, 15, 20, 22]})
Par1 Par2 user_id
0 1 10 1
1 3 15 2
2 7 20 1
3 9 22 2
我可以总结这些值:
df1.groupby([ "user_id"], as_index=False).sum()
我的问题是,是否有一种相对简单的方法来代替 sum() 来计算成对距离?
期望的输出
Par1 Par2 user_id
0 similarity[1,7] similarity[10,20] 1
1 similarity[3,9] similarity[15,22] 2
这看起来适用于您的简单示例并且应该是可扩展的。
def distance_metric(x1, x2):
return x2 - x1 # replace this with whatever you want
df_dist = pd.DataFrame()
df_dist['user_id'] = df.user_id.unique()
for col in (set(df.columns) - set(['user_id'])):
vals = [df[df.user_id == i][col].values for i in df.user_id.unique()]
vals = [distance_metric(val[0], val[1]) for val in vals]
df_dist[col] = vals
我正在尝试计算共享一个类别的行中值之间的距离。对于user_id1个参数1,1和7之间的距离Par 2 10、20之间的距离。
df1 = pd.DataFrame({"user_id":[1,2,1,2], "Par1":[1, 3, 7,9], "Par2":[10, 15, 20, 22]})
Par1 Par2 user_id
0 1 10 1
1 3 15 2
2 7 20 1
3 9 22 2
我可以总结这些值:
df1.groupby([ "user_id"], as_index=False).sum()
我的问题是,是否有一种相对简单的方法来代替 sum() 来计算成对距离?
期望的输出
Par1 Par2 user_id
0 similarity[1,7] similarity[10,20] 1
1 similarity[3,9] similarity[15,22] 2
这看起来适用于您的简单示例并且应该是可扩展的。
def distance_metric(x1, x2):
return x2 - x1 # replace this with whatever you want
df_dist = pd.DataFrame()
df_dist['user_id'] = df.user_id.unique()
for col in (set(df.columns) - set(['user_id'])):
vals = [df[df.user_id == i][col].values for i in df.user_id.unique()]
vals = [distance_metric(val[0], val[1]) for val in vals]
df_dist[col] = vals