У меня есть таблица с лабораторными результатами, включая «слепые дубликаты образцов». Это в основном образец, взятый дважды, где второй образец получил неописанную метку. Соответствующее происхождение; образец указывается в отдельной колонке

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 (может быть, кроме объединения всей таблицы с самим собой?)

0
user9118870 13 Мар 2018 в 11:11

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].

0
M. Mansour 13 Мар 2018 в 09:16

Не эффективный для памяти ответ, но это работает

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)
0
Rao Sahab 13 Мар 2018 в 08:34