У меня есть таблица с лабораторными результатами, включая «слепые дубликаты образцов». Это в основном образец, взятый дважды, где второй образец получил неописанную метку. Соответствующее происхождение; образец указывается в отдельной колонке
Labels = ['A1-1', 'A1-2', 'A1-3', 'A1-4','B1-2', 'B1-3', 'B1-4', 'B1-5', 'Blank1', 'Blank2', 'Blank3']
Values = [8356532 ,7616084,5272477, 5076012, 411851, 415258, 8285777, 9700884, 9192185, 4466890,830516]
Duplicate_of = ['','','','','','','','','A1-1', 'A1-4', 'B1-3']
d = {'Labels': Labels, 'Values': Values, 'Duplicate_of' : Duplicate_of}
df = pd.DataFrame(data=d)
df = df[['Labels','Values','Duplicate_of']]
Я хотел бы добавить столбец данных, который содержит «значение» из исходного образца для дубликатов. Таким образом, новый столбец («Original_value»), где для «Blank1» вводится значение «A1-1», для «Blank2» вводится значение «A1-4» и т. Д. Для строк, в которых «Duplicate_of» поле пусто, этот новый столбец также пуст.
В Excel это очень легко с Vlookup, но я не видел простой способ в Pandas (может быть, кроме объединения всей таблицы с самим собой?)
2 ответа
Вот самый простой способ сделать это в одной строке:
df["Original_value"] = df["Duplicate_of"].apply(lambda x: "" if x == "" else df.loc[df["Labels"] == x, "Values"].values[0])
Объяснение:
Это просто применяет лямбда-функцию к каждому элементу столбца "Duplicate_of"
Сначала мы проверяем, является ли элемент пустой строкой, и возвращаем пустую строку, если так:
"" if x == ""
Эквивалентно:
if x == "" return ""
Если это не пустая строка, выполняется следующая команда:
df.loc[df["Labels"] == x, "Values"].values[0]
Это простое возвращение значения в столбце "Values"
, когда условие df["Labels"] == x
выполняется. Если вас интересует часть .values[0]
, она есть, потому что .loc
возвращает серию; наша серия в этом случае - просто одно значение, поэтому мы просто получаем его с помощью .values[0]
.
Не эффективный для памяти ответ, но это работает
import numpy as np
dictionary = dict(zip(Labels, Values))
df["Original_value"] = df["Duplicate_of"].map(lambda x: np.nan if x not in dictionary else dictionary[x])
Для остальных значений в Original_Value он дает NaN. Вы можете решить, что вы хотите вместо этого.
Тип нового столбца не будет целочисленным, который также может быть изменен при необходимости.
С комментарием @jezrael можно сделать то же самое, что и
import numpy as np
dictionary = dict(zip(Labels, Values))
df["Original_value"] = df["Duplicate_of"].map(dictionary)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.