簡體   English   中英

基於標簽在同一數據框中的查找值,然后添加到新列(Vlookup)

[英]Lookup value in the same dataframe based on label and add to a new column (Vlookup)

我有一張表格,其中包含實驗室結果,包括“盲目重復樣品”。 這些基本上是兩次采樣的樣本,第二個樣本被賦予了非描述性標簽。 相應的起源 樣品在單獨的欄中顯示

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中我還沒有看到一種簡便的方法(也許除了將整個表自身連接起來以外?)

不是有效的記憶答案,但這可行

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)

在一行中,這是最簡單的方法:

df["Original_value"] = df["Duplicate_of"].apply(lambda x: "" if x == "" else df.loc[df["Labels"] == x, "Values"].values[0])

說明:

這只是將lambda函數應用於"Duplicate_of"列的每個元素

首先,我們檢查該項目是否為空字符串,如果是,則返回一個空字符串:

"" if x == ""

等效於:

if x == "" return ""

如果不是空字符串,則執行以下命令:

df.loc[df["Labels"] == x, "Values"].values[0]

當條件df["Labels"] == x為true時,此簡單返回"Values"列中的"Values" 如果您想知道.values[0]部分,那是因為.loc返回一個序列; 在這種情況下,我們的系列只是一個值,因此我們只需使用.values[0]即可獲得它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM