我有一张表格,里面有实验室的结果,包括“盲目复制样本”。这些基本上是两次采集的样本,第二个样本被赋予了一个无法描述的标签。相应的原件;样本在一个单独的列中显示。
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']]我想在dataframe中添加一个列,它保存了副本的原始示例中的“值”。因此,一个新列('Original_value'),其中对于'Blank1‘输入'A1-1’的值,为'Blank2‘输入'A1-4’的值,等等。对于'Duplicate_of‘字段为空的行,这个新列也是空的。
在excel中,使用Vlookup非常容易,但我在Pandas中还没有看到一种简单的方法(除了自己加入整个表之外?)
发布于 2018-03-13 09:16:55
下面是最简单的方法,只需一行:
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]当条件"Values"为真时,这个简单的返回列df["Labels"] == x中的值。如果您对.values[0]部件感到好奇,那么它的存在是因为.loc返回了一个系列;在本例中,我们的系列只是一个值,所以我们只需使用.values[0]获得它。
发布于 2018-03-13 08:22:52
不是一个内存高效的答案,但这是可行的。
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)https://stackoverflow.com/questions/49251163
复制相似问题