#python #pandas
Вопрос:
имея фрейм данных, моя цель состоит в том, чтобы вычислить процент предсказанных меток в соответствии со следующими условиями:
- Процент ресурсов, имеющих
manual_label
B@1
вход, например, если значение из colmanual_label
находится в colbaseline_1
- Процент резорбций, имеющих значение
manual_label
inB@3
, например, если значение из colmanual_label
находится в colbaseline_1,baseline_2,baseline_3
- Процент прогнозируемых ресурсов, имеющих значение
manual_label
inP@1
, например, если значение из colmanual_label
находится в collabel_1
- Процент прогнозируемых резорбций, имеющих значение
manual_label
inP@3
, например, если значение из colmanual_label
находится в collabel_1,label_2,label_3
Фрейм данных:
manual_label prediction index label_1 label_2 label_3 baseline_1 baseline_2 baseline_3
0 1 7 0 7 1 9 1 9 4
1 1 1 1 1 7 4 1 9 4
2 9 4 2 4 1 7 1 9 4
3 3 4 3 4 9 3 1 9 4
4 1 1 4 1 4 7 1 9 4
.. ... ... ... ... ... ... ... ... ...
496 1 1 496 1 7 3 1 9 4
497 1 1 497 1 4 7 1 9 4
498 4 7 498 4 7 1 1 9 4
499 4 1 499 7 4 1 1 9 4
500 1 1 500 1 7 4 1 9 4
с помощью этого решения
baseline_p1=0
baseline_p3=0
pred_p1=0
pred_p3=0
rows=final.shape[0]
for i in range(rows):
gold = final.iloc[i]["manual_label"]
baseline=[final.iloc[i]["baseline_1"], final.iloc[i]["baseline_2"],final.iloc[i]["baseline_3"]]
for j in range(len(baseline)):
baseline[j]=baseline[j].strip()
predictions=[final.iloc[i]["label_1"], final.iloc[i]["label_2"],final.iloc[i]["label_3"]]
for j in range(len(predictions)):
predictions[j]=predictions[j]
if (gold==baseline[0]):
baseline_p1 =1
if (gold in baseline):
baseline_p3 =1
if (gold==predictions[0]):
pred_p1 =1
if (gold in predictions):
pred_p3 =1
print("Raw counts: B@1={} B@3={} P@1={} P@3={}",baseline_p1,baseline_p3,pred_p1,pred_p3)
print("Percentages: B@1={} B@3={} P@1={} P@3={}",baseline_p1/rows,baseline_p3/rows,pred_p1/rows,pred_p3/rows)
Я могу получить только процент от B@1
и B@3
. Для P@1
и P@3
в результате у меня есть 0.0
Raw counts: B@1={} B@3={} P@1={} P@3={} 171 374 0 0
Percentages: B@1={} B@3={} P@1={} P@3={} 0.3413173652694611 0.7465069860279441 0.0 0.0
Как я могу решить эту проблему?
Спасибо
Ответ №1:
Нет необходимости перебирать строки, потому что вместо этого вы можете работать с логическими рядами:
manual_is_base1 = final.manual_label == final.baseline_1
manual_is_base2 = final.manual_label == final.baseline_2
manual_is_base3 = final.manual_label == final.baseline_3
manual_is_anybase = manual_is_base1 | manual_is_base2 | manual_is_base3
manual_is_pred1 = final.manual_label == final.label_1
manual_is_pred2 = final.manual_label == final.label_2
manual_is_pred3 = final.manual_label == final.label_3
manual_is_anypred = manual_is_pred1 | manual_is_pred2 | manual_is_pred3
baseline_p1 = sum(manual_is_base1)
baseline_p3 = sum(manual_is_anybase)
pred_p1 = sum(manual_is_pred1)
pred_p3 = sum(manual_is_anypred)
В любом случае, я думаю, что проблема, с которой вы столкнулись при вычислении pred_p1
, pred_p3
связана не с вашим кодом, а скорее с проблемой в ваших данных. После удаления for j in range(len(baseline)): baseline[j]=baseline[j].strip()
из вашего кода я запустил его на фрагменте фрейма данных, который вы опубликовали, и он работал, как и ожидалось.
Тот факт, что у вас есть эти две строки в коде, указывает на то, что базовые значения в ваших данных являются строками, что уже является плохим знаком. Попробуйте выяснить, почему и исправить данные, чтобы панды могли использовать их в качестве числового типа.