下流タスク用のデータの準備には多くの時間がかかります。データ クリーニング、欠損値の処理、特徴量エンジニアリング、データの前処理または後処理が含まれるかどうかに関係なく、このフェーズには多くの時間がかかります。
そこで、私は、他の 2 つの列のデータに基づいて既存の列から値を抽出して、Pandas DataFrame に新しい列を作成する必要がある後処理タスクに取り組んでいました。
LLM に直接コードを書いてもらうこともできましたが (いつもそうしています)、今回は自分で書きたいと思いました。朝だったので頭もすっきりしていたので、複雑なデータ操作を処理する気分でした。
これが私がしなければならなかった事です。データフレームがありました predicted_categories、 pred_category_idそして text_predicted_probs カラム。
の値 predicted_categories 列には、「category_id」から「category_description」の形式で 5 つのカテゴリがリストされます。
['80814001 - Freze Uçları',
'13003106 - Freze',
'80805004 - Sanayi Makineleri',
'13003144 - Torna Makinesi',
'13003195 - Kumpas']
text_predicted_probs 列には、これら 5 つのカテゴリの推定確率が順番に含まれています。
[0.943, 0.018, 0.008, 0.006, 0.004]
したがって、次の最初の値は、 text_predicted_probs は次の一次確率です predicted_categories等々。
pred_category_id 列には、別のモデルから予測されたカテゴリ ID が表示されます。必要なのはカテゴリの予測確率です pred_category_id 柱。
これを注文する必要があります pred_category_id で predicted_categories 列を取得し、その値を取得します test_predicted_probs 柱。
下の図は、私が達成したいことを示しています。

この図では、リストの 2 番目の項目であるカテゴリ 13003106 の確率を取得したいと考えています。対応する確率値は 0.018 です。
Gemini やその他の先進的なモデルに質問すれば、おそらく数秒以内に答えが得られるでしょう。でも、まずは自分でやってからジェミニさんにお願いしたいと思いました。
データセットを Pandas DataFrame に読み込み始めましょう。
import pandas as pd
results = pd.read_csv("prediction_results.csv")
の値 predicted_categories 列は、カテゴリ ID とカテゴリ名を含む文字列のリストです。
results.loc[0, "predicted_categories"]
# output: "['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']"
これはリストですが、文字列として保存されているため、最初に次を使用してリスト オブジェクトに変換します。 literal_eval 内蔵のワーク ast Python モジュール:
ast.literal_eval(results.loc[0, "predicted_categories"])
# output:
['80814001 - Freze Uçları',
'13003106 - Freze',
'80805004 - Sanayi Makineleri',
'13003144 - Torna Makinesi',
'13003195 - Kumpas']
カテゴリ ID を抽出するには、このリスト内の各文字列を「-」文字で分割し、分割後の最初の部分を選択します。 5 つのカテゴリを含むリストがあるため、リスト内包表記でこの操作を次のように実行する必要があります。
[category.split("-")[0].strip()
for category in ast.literal_eval(results.loc[0, "predicted_categories"])]
# output:
['80814001', '13003106', '80805004', '13003144', '13003195']
これを単一の値 (つまり 1 行) に対して実行しました。全体に対して同じ操作を行うには predicted_categories 列では、リスト内包表記を使用できます。これは、別のリスト内包表記内のリスト内包表記 (つまり、ネストされたリスト内包表記) になります。
results.loc[:, "predicted_category_ids"] = [
[category.split("-")[0].strip() for category in ast.literal_eval(predicted_categories)]
for predicted_categories in results["predicted_categories"]
]
これで、predicted_categories 列からカテゴリ ID が抽出されました。

次のステップは、予測されたカテゴリ ID リスト内のカテゴリの順序を確認することです。次に、このコマンドを使用して、カテゴリの予測確率を見つけます。
Python List オブジェクトには、リスト内の項目のインデックス (つまり順序) を返す Index メソッドがあります。
results.loc[0, "predicted_category_ids"]
# output:
['80814001', '13003106', '80805004', '13003144', '13003195']
results.loc[0, "predicted_category_ids"].index("13003106")
# output:
2
予測されたカテゴリ ID のインデックスを取得したら、それを使用してこのカテゴリ ID の確率を取得できます。 text_predicted_probs カラム:

何をする必要がありますか:
- のインデックスを取得する
pred_category_idでpredicted_category_ids - このインデックスを使用して関連する値を抽出します
text_predicted_probs
これら 3 つの列を zip 圧縮することで、これらの手順を 1 回の操作で実行できます。最初の行でテストしてみましょう。
for i, j, k in zip(results["pred_category_id"][:1], results["predicted_category_ids"][:1], results["text_predicted_probs"][:1]):
print(j.index(str(i))) # get the index of pred_category_id in predicted_category_ids
print(ast.literal_eval(k)[j.index(str(i))]) # get the value at this index in text_predicted_probs
# output:
0
0.943
上のスクリーンショットで出力を確認できます。 pred_category_id 80814001。これはその中の最初の項目です (つまり、インデックス = 0)。 predicted_category_ids そして、最初の確率値は 0.943 です。
のリスト text_predicted_probs 列も文字列として保存されるので、適用します。 literal_eval それらをリストオブジェクトに変換する機能。
次のようにリスト内包表記を使用して、データフレーム全体に対してこの操作を実行できます。
results.loc[:, "pred_category_prob"] = [
float(ast.literal_eval(k)[j.index(str(i))]) if str(i) in j else 0
for i, j, k in zip(results["pred_category_id"], results["predicted_category_ids"], results["text_predicted_probs"])
]
基本的に、前のコード ブロックのループをリスト内包表記に変換しました。チェックを 1 つだけ追加しました」if str(i) in j else 0「行がいくつかあるので」 pred_category_id 彼は存在しません predicted_category_ids。このような場合、確率値を 0 に設定します。
以下に示すように、タスクは完了しました。

ジェミニはどうやってそれをやったのですか?
休憩込みで1時間ほど作業して無事完了しました。そして、私はミスンが同じ課題をどのように処理するかを見てみたいと思いました。
私は目標を説明するプロンプトを作成し、データの小さなサンプルを含めました。
Gemini が最初の試みで作成したものは次のとおりです。
import pandas as pd
# 1. Create the sample DataFrame
data = {
'predicted_categories': [
['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']
],
'pred_category_id': [80814001],
'text_predicted_probs': [
[0.943, 0.018, 0.008, 0.006, 0.004]
]
}
df = pd.DataFrame(data)
# 2. Define a function to extract the probability matching the category ID
def get_matching_prob(row):
# Convert ID to string for matching
target_id_str = str(row['pred_category_id'])
# Iterate through the categories to find the matching index
for index, category in enumerate(row['predicted_categories']):
if category.startswith(target_id_str):
# Return the corresponding probability from the same index
return row['text_predicted_probs'][index]
# Return None (or 0) if no match is found to prevent the code from crashing
return None
# 3. Create the new column
df['pred_category_prob'] = df.apply(get_matching_prob, axis=1)
# Display the result
print(df[['pred_category_id', 'pred_category_prob']])
まず、プロンプトで提供したデータを使用してサンプル データフレームを作成しました。次に、私が説明したことを正確に実行する関数を作成しました。
自分でコードを書くのに約 1 時間かかりました。 Gemini は、私が書くのにわずか数分しかかからなかったプロンプトに基づいて、まったく同じタスクを数秒で完了しました。
ただし、Gemini のコードには小さな問題があります。それを使用します apply ベクトル化されていない関数。大規模なデータセットを操作する場合、apply 関数 (基本的に for ループ) を使用すると、実行時間が長くなる可能性があります。
しかし、解決策は簡単です。 Gemini にこれのベクトル化バージョンを作成するよう依頼したところ、次のような結果が得られました。
import pandas as pd
# Sample DataFrame
data = {
'predicted_categories': [
['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri'],
['13003144 - Torna Makinesi', '13003195 - Kumpas']
],
'pred_category_id': [80814001, 13003195],
'text_predicted_probs': [
[0.943, 0.018, 0.008],
[0.6, 0.4]
]
}
df = pd.DataFrame(data)
# 1. Explode both list columns simultaneously to maintain alignment between category and probability
df_exploded = df.explode(['predicted_categories', 'text_predicted_probs'])
# 2. Extract the numeric ID from the category string using vectorized regex
df_exploded['extracted_id'] = df_exploded['predicted_categories'].str.extract(r'^(\d+)').astype(float)
# 3. Filter for rows where the extracted ID matches the target 'pred_category_id'
matched = df_exploded[df_exploded['extracted_id'] == df_exploded['pred_category_id']]
# 4. Dedup the index (safety net in case an ID appears twice within the same list)
matched = matched[~matched.index.duplicated(keep='first')]
# 5. Map the extracted probability column back to the original DataFrame using the index
df['pred_category_prob'] = matched['text_predicted_probs']
df
2 番目の解決策は完璧で、私が書いたコードよりもはるかに簡単に見えました。
そのため、LLM であれば 5 分以内に完了するタスクに、私は約 1 時間を費やしました。ただし、パンダの仕組みを知らなかったら、最適ではない最初の解決策を受け入れていたでしょう。これは、LLM がどのように生産性を向上させることができるかを示す完璧な例ですが、それは自分が何をしているのかを本当に理解している場合に限られます。








Leave a Reply