![](/img/trans.png)
[英]pandas: add new column based on datetime index lookup of same dataframe
[英]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.