You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中优化Apriori算法结果DataFrame的Rule列显示

问题与解决方案

问题描述

我使用Apriori算法生成推荐结果,将结果存储在名为result的DataFrame中,该DataFrame包含Rule、Support、Confidence三列。在Flask中展示该结果时,Rule列显示带有['']的格式(例如['教师'] -> ['程序员']),但我希望显示为无括号和引号的样式(例如教师 -> 程序员)。相关代码如下:

DataFrame构建代码

Result=pd.DataFrame(columns=['Rule','Support','Confidence'])
for idx, elem in enumerate(association_results):
    thiselem = elem
    nextelem = association_results[(idx + 1) % len(association_results)]
    Result=Result.append({
        'Rule':str([str(x) for x in thiselem[0]])+ " -> " +str([str(x) for x in nextelem[0]]),
        'Support':str(round(elem[1] *100, 2))+'%',
        'Confidence':str(round(elem[2][0][2] *100, 2))+'%'
        },ignore_index=True) 

Flask路由代码

@app.route('/rekomendasi', methods=['POST'])
def rekomendasi():
    sup = request.form.get('support')
    conf = request.form.get('confidence')

    # Model
    store_data = pd.read_csv('dataPekerjaan.csv', sep=',', header=None, error_bad_lines=False)
    records = []
    # memisahkan data menjadi list
    for i in range(store_data.shape[0]):
        records.append([str(store_data.values[i, j]).split(',') for j in range(store_data.shape[1])])

    # hanya ambil data nama pekerjaan
    dataKerja = [[] for dataKerja in range(len(records))]
    for i in range(len(records)):
        for j in records[i][1]:
            dataKerja[i].append(j)

    min_sup = float('0.00' + str(sup))
    min_conf = float('0.00' + str(conf))

    association_rules = apriori(dataKerja, min_support=min_sup, min_confidence=min_conf, min_length=2)
    association_results = list(association_rules)

    # menampilkan hasil asosiasi
    pd.set_option('max_colwidth', 200)
    result = pd.DataFrame(columns=['Rule', 'Support', 'Confidence'])

    for item in association_results:
        pair = item[2]
        for i in pair:
            result = result.append({
                'Rule': str([x for x in i[0]]) + " -> " + str([x for x in i[1]]),
                'Support': str(round(item[1] * 100, 2)) + '%',
                'Confidence': str(round(i[2] * 100, 2)) + '%'
            }, ignore_index=True)

    return render_template('rekomendasi.html', name='made', sup = sup, conf = conf, len= len(result)-1,  query = result)

HTML模板代码

{%for i in range(len) %}
    <tr>
        <th>{{i+1}}</th>
        <td>{{query['Rule'][i]}}</td>
        <td>{{query['Support'][i]}}</td>
        <td>{{query['Confidence'][i]}}</td>
    </tr>
{%endfor%}

解决方案

问题出在生成Rule列时,直接用str()转换列表会保留Python列表的默认格式(方括号、引号)。只需修改生成Rule的代码,用', '.join()方法将列表元素拼接为纯文本即可:

修改Flask路由中的代码

for item in association_results:
    pair = item[2]
    for i in pair:
        result = result.append({
            # 用join拼接列表元素,去掉括号和引号
            'Rule': ', '.join(i[0]) + " -> " + ', '.join(i[1]),
            'Support': str(round(item[1] * 100, 2)) + '%',
            'Confidence': str(round(i[2] * 100, 2)) + '%'
        }, ignore_index=True)

修改旧DataFrame构建代码(若仍需使用)

Result=Result.append({
    'Rule':', '.join(str(x) for x in thiselem[0])+ " -> " +', '.join(str(x) for x in nextelem[0]),
    'Support':str(round(elem[1] *100, 2))+'%',
    'Confidence':str(round(elem[2][0][2] *100, 2))+'%'
    },ignore_index=True) 

原理说明

', '.join(列表)会遍历列表中的每个元素,用逗号加空格连接成一个字符串。如果列表只有单个元素,就直接返回该元素的纯文本,不会出现括号和引号,完全符合展示需求。


内容的提问来源于stack exchange,提问作者A fish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:05:19