Keterampilan python tingkat rendah di sini (mempelajari pemrograman dengan SAS).

Saya mencoba menerapkan serangkaian formula pencocokan string fuzzy (fuzzywuzzy lib) pada pasangan string, disimpan dalam kerangka data dasar. Sekarang saya bingung tentang cara untuk melakukannya.

Haruskah saya menulis loop yang membuat kerangka data spesifik untuk setiap formula dan kemudian menambahkan semua sub-bingkai data ini dalam satu kerangka? Masalah dengan pendekatan ini tampaknya adalah, karena saya tidak dapat secara dinamis memberi nama sub-dataframe, nilai yang dihasilkan akan ditimpa pada setiap putaran loop.

Atau haruskah saya membuat satu kerangka data dalam satu lingkaran, mengambil nama dan ekspresi rumus saya sebagai dict? Masalahnya di sini memberi saya masalah yang sama seperti di atas.

Inilah rumus saya dict:

# ratios dict: all ratios names and functions
ratios = {"ratio": fuzz.ratio, 
          "partial ratio": fuzz.partial_ratio, 
          "token sort ratio": fuzz.token_sort_ratio, 
          "partial token sort ratio": fuzz.partial_token_sort_ratio,
          "token set ratio": fuzz.token_set_ratio,
          "partial token set ratio": fuzz.partial_token_set_ratio
          }

Dan inilah loop yang saat ini saya berkeringat:

# for loop iterating over ratios
for r, rn in ratios.items():

    # fuzzing function definition
    def do_the_fuzz(row):
        return rn(row[base_column], row[target_column])

    # new base df containing ratio data and calculations for current loop turn
    df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
    df_out1['mesure'] = r
    df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)

Ini memberi saya masalah yang sama, yaitu kolom 'ukuran' ditimpa, dan saya berakhir dengan kolom yang penuh dengan nilai terakhir (di sini: 'set token parsial').

Masalah saya secara keseluruhan adalah saya tidak dapat memahami apakah dan bagaimana saya dapat secara dinamis memberi nama kerangka data, kolom, atau nilai dalam loop python (atau jika saya bahkan harus melakukannya).

Saya sudah terlalu lama mencoba mencari solusi sendiri dan saya tidak bisa menemukan jawabannya. Wawasan apa pun akan sangat dihargai! Banyak terima kasih sebelumnya!

0
davidv 4 Mei 2020, 10:25

1 menjawab

Jawaban Terbaik

Saya akan membuat kerangka data yang diperbarui pada setiap iterasi loop:

final_df = pd.DataFrame()
for r, rn in ratios.items():
    ...
    df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
    df_out1['mesure'] = r
    df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)

    final_df = pd.concat([final_dfl, df_out1], axis=0)

Saya harap ini dapat membantu Anda.

1
DavideBrex 4 Mei 2020, 09:27