上周这个时候我没有pandas/python的经验,所以我在尝试将excel中完成的复杂、多步骤的过程转换为pandas时,经历了一段陡峭的学习曲线。抱歉,如果以下内容不清楚
我合并了2个数据帧。我有一个列,我们称之为“new_ID”,其中包含来自originaldf1的新ID名称,其中一些表示“未找到匹配项”。对于“未找到匹配项”条目,我想从originaldf2(currentdf中的另一列)获取旧ID号,我们将此列称为“旧ID”。因此,我想做一些类似于excel vlookup的事情,我说:“如果在col‘new_ID’中没有‘找到匹配项’,请给我同一行col‘old_ID’中的ID。”。我想要的输出只是一个没有找到匹配项的所有旧ID的列表
我尝试了一些在这里找到的解决方案,但都只给出了空白输出。我假设这是因为他们没有搜索“未找到匹配项”的每个个体。例如,我尝试:
deletes = mydf.loc[mydf['new_ID'] == "no match was found", ['old_ID']
结果是,只有列标题,然后全部为空
我想在熊猫身上做的事可能吗?或者我被困在excel的思维方式中,有一种更好/不同的方式
根据您的示例,我将假设所有
new_ID
条目都是数字,除非没有匹配项所以,如果您的数据帧看起来像这样(假设第2列有任何值,我不知道,所以我将0)
接下来,我们可以通过使用
str.isnumeric()
查看new_id
列是否包含一个数字来检查它是否有id最后我们将使用
where()
这是做什么的?它接受我们传递的has_id
bollean过滤器的第一个参数cond
,并检查它的True
还是False
。如果为true,则保持原始值;如果为false,则转到other
中的参数,在本例中,我们将该参数指定给数据帧的第二列欢迎使用Python。在熊猫中,你要做的是一项简单的任务。一个pandas Dataframe的每一列都是一个序列对象;基本上是一个值列表。您正在尝试查找哪些行号(又称索引)满足以下条件:
new_id == "no match was found"
。这可以通过将列从数据帧中拉出并应用lambda函数来实现。我建议将这段代码粘贴到一个新文件中,然后四处看看它是如何工作的关于此代码的几个注意事项:
df.loc[]
指数据帧的特定行df.loc[2]
指第三行(因为熊猫数据帧通常是zero-indexed)x == "no match"
。将括号[]
放在其周围会将输出转换为列表。因此,在这种情况下,[lambda x: x == "no_match"]
的输出将是一个真值或假值列表。然后将该列表应用于我们的Series对象,以便只返回带有True
的行李>.index.tolist()
后,将Series对象转换为其索引列表李>相关问题 更多 >
编程相关推荐