Ошибка при работе с данными pandas (в случае отсутствия данных)

#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')