Python 计算熊猫数据帧中两行之间的LDA分布之间的距离

Python 计算熊猫数据帧中两行之间的LDA分布之间的距离,python,pandas,Python,Pandas,我有一个数据框,包含LDA主题分发输出以及其他人口统计信息,如下所示: single_df = pd.DataFrame([{"department": 'marketing', 'LDA_1': 0.252, 'LDA_2':0.002, 'LDA_3':0.50}, {"department": 'engineering', 'LDA_1': 0.478, 'LDA_2':0.152, 'LDA_3'

我有一个数据框,包含LDA主题分发输出以及其他人口统计信息,如下所示:

single_df = pd.DataFrame([{"department": 'marketing', 'LDA_1': 0.252, 'LDA_2':0.002, 'LDA_3':0.50},
                          {"department": 'engineering', 'LDA_1': 0.478, 'LDA_2':0.152, 'LDA_3':0.492},
                          {"department": 'cooperate', 'LDA_1': 0.52, 'LDA_2':0.780, 'LDA_3':0.50},
                          {"department": "marketing", 'LDA_1': 0.352, 'LDA_2':0.052, 'LDA_3':0.20}])

我想进入下面的最终数据帧。我如何编写一个函数来计算返回到数据帧下方的两行(列名包含“LDA_”)之间的Jenson-Shannon距离

i j same_department distance_LDA
0 1          0        0.23
0 2          0        0.43
0 3          1        0.26
1 2          0        0.24
1 3          0        0.11
2 3          0        0.29
我已经编写了如下代码来计算各个对之间的JS距离。如何将其转换为函数

array=single_df.filter(regex='LDA').to_numpy()
distance.jensenshannon(array[0],array[1])
然后,为了计算两个人是否共享该部门,我有以下代码:

def same_department(i,j):
    if i['department'] == j['department']:
        return 1
    else:
        return 0   

让我们尝试生成所有可能的行组合,合并以生成一个数据帧,其中比较可以在同一行中进行。然后根据列后缀按行应用jensenshannon函数:

来自itertools导入组合的

从scipy.spatial.distance导入jensenshannon
作为pd进口熊猫
single_df=pd.DataFrame([{“部门”:“营销”,“LDA_1”:0.252,
“LDA_2”:0.002,“LDA_3”:0.50},
{“部门”:“工程”,“LDA_1”:0.478,
“LDA_2”:0.152,“LDA_3”:0.492},
{“部门”:“合作”,“LDA_1”:0.52,
“LDA_2”:0.780,“LDA_3”:0.50},
{“部门”:“市场营销”,“LDA_1”:0.352,
'LDA_2':0.052,'LDA_3':0.20}])
#将3个LDA列合并到包含列表的单个列中
single_-df['LDA']=single_-df.filter(regex='^LDA.*').agg(列表,轴=1)
#去掉原来的LDA_X列
single_df=single_df.filter(正则表达式=“^(?!LDA_uu173)”
#获取所有行组合
a、 b=地图(列表,zip(*组合(单个索引,2)))
#合并
df=single_df.loc[a]。重置索引()。合并(
单方向定位[b]。重置索引(),
左索引=真,
右索引=真,
)
#将Jenson Shannon应用于LDA_x和LDA_y列表
df['distance\u LDA']=df.apply(
λx:jensenshannon(x['LDA_x'],x['LDA_y'],轴=1)
#如果在同一个部门
df['same_department']=df['department_x'].eq(df['department_y']).astype(int)
#重命名和筛选列
df=df\
.rename(列={'index_x':'i',
'index_y':'j'})[[i','j',
“同一部门”,
“距离”\u LDA']]
#展示
打印(df.to_字符串(索引=False))
输出:

i  j  same_department  distance_LDA
0  1                0      0.235849
0  2                0      0.429508
0  3                1      0.264777
1  2                0      0.238155
1  3                0      0.112456
2  3                0      0.299704

谢谢想知道除了使用“apply()”函数之外,是否还有更快的方法来计算J-S距离?我的实际数据帧有超过1M行。任何建议都将不胜感激!也许可以进行一些优化,但为了显著提高性能,需要进行一些主要的重构。可能有一些好的想法,或者你可以考虑多重处理。