在合并的df中执行相当于vlookup的操作

2024-09-29 23:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

上周这个时候我没有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的思维方式中,有一种更好/不同的方式

enter image description here


Tags: 数据idpandasnew过程方式步骤col
2条回答

根据您的示例,我将假设所有new_ID条目都是数字,除非没有匹配项

所以,如果您的数据帧看起来像这样(假设第2列有任何值,我不知道,所以我将0)

^{tb1}$

接下来,我们可以通过使用str.isnumeric()查看new_id列是否包含一个数字来检查它是否有id

has_id =df1.new_ID.str.isnumeric()
has_id>>>

0     True
1     True
2     True
3    False
4     True
Name: new_ID, dtype: bool

最后我们将使用where() 这是做什么的?它接受我们传递的has_idbollean过滤器的第一个参数cond,并检查它的True还是False。如果为true,则保持原始值;如果为false,则转到other中的参数,在本例中,我们将该参数指定给数据帧的第二列

df1.where(has_id, df.iloc[:,1], axis=0)>>>
  new_ID old_df_2
0   1   0
1   2   0
2   3   0
3   4   4

欢迎使用Python。在熊猫中,你要做的是一项简单的任务。一个pandas Dataframe的每一列都是一个序列对象;基本上是一个值列表。您正在尝试查找哪些行号(又称索引)满足以下条件:new_id == "no match was found"。这可以通过将列从数据帧中拉出并应用lambda函数来实现。我建议将这段代码粘贴到一个新文件中,然后四处看看它是如何工作的

import pandas as pd

# Create test data frame
df = pd.DataFrame(columns=('new_id','old_id'))
df.loc[0] = (1, None)
df.loc[1] = ("no match", 4)
df.loc[2] = (3, None)
df.loc[3] = ("no match", 4)
print("\nHere is our test dataframe:")
print(df)

print("\nShow the values of the 'new_id' that meet our criteria:")
print(df['new_id'][lambda x: x == "no match"])

# Pull the index from these rows
indeces = df['new_id'][lambda x: x == "no match"].index.tolist()
print("\nIndeces:\n", indeces)

print("\nShow only the rows of the data frame that match 'indeces':")
print(df.loc[indeces]['old_id'])

关于此代码的几个注意事项:

  • df.loc[]指数据帧的特定行df.loc[2]指第三行(因为熊猫数据帧通常是zero-indexed
  • 这里的lambda函数分别获取列表(或系列对象)的每个值,并将这些值逐个插入到函数中。在本例中,我们将“new_id”的每个值引用为“x”,然后检查x == "no match"。将括号[]放在其周围会将输出转换为列表。因此,在这种情况下,[lambda x: x == "no_match"]的输出将是一个真值或假值列表。然后将该列表应用于我们的Series对象,以便只返回带有True的行
  • 应用lambda函数.index.tolist()后,将Series对象转换为其索引列表

相关问题 更多 >

    热门问题