#python #python-3.x #pandas #numpy
Вопрос:
У меня есть фрейм данных «indata2». Следующий код позволяет мне добавить столбец «Индикатор», который группирует мои данные на основе Indata2 [«Метка»].
import pandas as pd import numpy as np indata2 = [[2, 'SIS X ', 9.65, 'Q'], [2, 'SIS X-', 5.32, 'Q'], [2, 'SIS Y ', 8.24, 'Q'], [2, 'SIS Y-', 3.27, 'Q'], [2, 'SIS', 3.40, 'Q'], [2, 'C. VIV', 0.23, 'L'], [2, 'SOBRE P', 0.38, 'SD'], [2, 'SOBRE P', 0.19, 'SD'], # [2, 'VIEN X ', 7.36, 'W'], # [2, 'VIEN X-', 23.09, 'W'], # [2, 'VIEN Y ', 6.66, 'W'], # [2, 'VIEN Y-', 2.68, 'W'], [4, 'SIS X ', 14.41, 'Q'], [4, 'SIS X-', 12.23, 'Q'], [4, 'SIS Y ', 10.00, 'Q'], [4, 'SIS Y-', 11.00, 'Q'], [4, 'C. VIV', 0.38, 'L'], [4, 'C. VIV', 0.34, 'L'], [4, 'C. VIV', 0.13, 'L'], [4, 'SOBRE P', 0.62, 'SD']] # [4, 'VIEN X ', 29.21, 'W'], # [4, 'VIEN X-', 8.70, 'W'], # [4, 'VIEN Y-', 7.46, 'W'], # [4, 'VIEN Y ', 11.62, 'W'], # [4, 'VIEN', 9.6, 'W']] indata2 = pd.DataFrame(data = indata2, columns = ['KeyData', 'Text', 'AvgAbs', 'Label']) l = indata2.Label.unique() m = pd.DataFrame(l, columns = ['Label']) m['Indicator'] = m.index 1 outputdata = indata2.merge(m[['Indicator','Label']],'left') mapper = {label: i 1 for i, label in enumerate(indata2["Label"].unique())} indata2["Indicator"] = np.select([(indata2["Label"]=="Q")amp;(indata2["Text"].str.contains("X")), (indata2["Label"]=="Q")amp;(indata2["Text"].str.contains("Y")), (indata2["Label"]=="W")amp;(indata2["Text"].str.contains("X")), (indata2["Label"]=="W")amp;(indata2["Text"].str.contains("Y")), (indata2["Label"].isin(list("QW"))amp;~(indata2["Text"].str.contains("[X-Y]", regex=True))) ], [mapper["Q"] 0.1, mapper["Q"] 0.2, mapper["W"] 0.1, mapper["W"] 0.2, 0], indata2["Label"].map(mapper))
В столбце indata2[«Метка»] у меня есть две специальные метки: W и Q, которые сгруппированы на основе indata2 [«Метка»] и indata2 [«Текст»].
Все в порядке, но возникает ошибка в случае, когда в indata2 [«Метка»] не введены Q, W или обе метки (что может произойти, потому что они являются данными). Когда это происходит, у меня появляется ошибка типа: Ошибка ключа.
Примечание: Прокомментированные строки кода предназначены для случая, когда метки Q, W или обе не введены, и в этом случае это приводит к ошибке. Но это очень хорошо работает, когда я их раскомментирую.
Какое решение можно дать в этом случае? Приветствие.
Комментарии:
1. Что вы хотите , чтобы произошло, когда тот или иной ярлык не существует? Вы хотите, чтобы он сгруппировался по другому значениюgt; Вставить значение? Потерпите неудачу с более конкретным ответом? Вы можете использовать
if
логикуtry: except
или другие проверки, но это помогло бы , если бы вы объяснили немного более четко
Ответ №1:
Убедитесь, что у картографа всегда есть значения Q и W, даже если они вам не нужны:
mapper = {"Q": 1, "W": 2} mapper.update({label: i 2 for i, label in enumerate(indata2[~indata2["Label"].isin(["Q","W"])]["Label"].unique())}) indata2["Indicator"] = np.select([(indata2["Label"]=="Q")amp;(indata2["Text"].str.contains("X")), (indata2["Label"]=="Q")amp;(indata2["Text"].str.contains("Y")), (indata2["Label"]=="W")amp;(indata2["Text"].str.contains("X")), (indata2["Label"]=="W")amp;(indata2["Text"].str.contains("Y")), (indata2["Label"].isin(list("QW"))amp;~(indata2["Text"].str.contains("[X-Y]", regex=True))) ], [mapper["Q"] 0.1, mapper["Q"] 0.2, mapper["W"] 0.1, mapper["W"] 0.2, 0], indata2["Label"].map(mapper)) gt;gt;gt; indata2 KeyData Text AvgAbs Label Indicator 0 2 SIS X 9.65 Q 1.1 1 2 SIS X- 5.32 Q 1.1 2 2 SIS Y 8.24 Q 1.2 3 2 SIS Y- 3.27 Q 1.2 4 2 SIS 3.40 Q 0.0 5 2 C. VIV 0.23 L 2.0 6 2 SOBRE P 0.38 SD 3.0 7 2 SOBRE P 0.19 SD 3.0 8 4 SIS X 14.41 Q 1.1 9 4 SIS X- 12.23 Q 1.1 10 4 SIS Y 10.00 Q 1.2 11 4 SIS Y- 11.00 Q 1.2 12 4 C. VIV 0.38 L 2.0 13 4 C. VIV 0.34 L 2.0 14 4 C. VIV 0.13 L 2.0 15 4 SOBRE P 0.62 SD 3.0
Кроме того, вам не нужны следующие строки (и их следует удалить из вашего кода):
l = indata2.Label.unique() m = pd.DataFrame(l, columns = ['Label']) m['Indicator'] = m.index 1 outputdata = indata2.merge(m[['Indicator','Label']],'left')