pandas - 从另一个数据框 pandas 获取相应的列值
问题描述
以下是我正在比较的两个数据框。当我能够匹配列时,我想在 column Usage
in下获取相应的列值。感谢帮助。df2
Item
df1 = pd.DataFrame({ 'Number':[1.0,3.0,4.0,5.0,8.0,12.0,32.0,58.0,72.0] , 'Item': ['Phone', 'Watch', 'Pen', 'Pencil', 'Pencil', 'toolkit', 'box', 'fork', 'toy']})
df2 = pd.DataFrame({'Number':[3.0, 4.0, 8.0, 12.0, 15.0, 32.0, 54.0, 58.0, 72.0], 'Item':['Watch', 'Pen', 'Pencil', 'Eraser', 'bottle', 'box', 'toolkit', 'fork', 'Phone'], 'Usage':['Time', 'Writing', 'Writing', 'Cleaning', 'Water', 'storage', 'Utility', 'Eat', 'Communication']})
df1
Number Item
0 1.0 Phone
1 3.0 Watch
2 4.0 Pen
3 5.0 Pencil
4 8.0 Pencil
5 12.0 toolkit
6 32.0 box
7 58.0 fork
8 72.0 toy
df2
Number Item Usage
0 3.0 Watch Time
1 4.0 Pen Writing
2 8.0 Pencil Writing
3 12.0 Eraser Cleaning
4 15.0 bottle Water
5 32.0 box storage
6 54.0 toolkit Utility
7 58.0 fork Eat
8 72.0 Phone Communication
用于匹配的代码如下。即使只有数字匹配,它也会显示“MatchedBoth”。这需要修复。
import numpy as np
df3 = df1.copy()
df3['Matching'] = np.nan
df3.loc[(df3.Number.isin(df2.Number)) & (df3.Item.isin(df2.Item)), 'Matching'] = 'MatchedBoth'
df3.loc[(df3.Number.isin(df2.Number)) & (~df3.Item.isin(df2.Item)),'Matching'] = 'Matched Number Only'
df3.Matching.fillna('No Match', inplace=True)
在同一代码中是否有可能嵌入一个返回值,该返回值可以Usage
从 中获取列值df2
,对应于每个匹配的行。可能存在多行可以匹配的情况,因此我们可能需要将相应的Usage
列值放入列表或最终输出中的类似内容中。
注意:在我的实际数据框中,除了这些之外,我还有几列,因此如果我使用合并,它会导致一个巨大的数据框。我只想创建一个新列,其中包含Usage
在 df2 列中找到的相应匹配值列表。
输出应如下所示。
df3
Number Item Matching Usage
0 1.0 Phone No Match NaN
1 3.0 Watch MatchedBoth Time
2 4.0 Pen MatchedBoth Writing
3 5.0 Pencil No Match NaN
4 8.0 Pencil MatchedBoth Writing
5 12.0 toolkit Matched Number Only Utility
6 32.0 box MatchedBoth storage
7 58.0 fork MatchedBoth Eat
8 72.0 toy Matched Number Only Play
解决方案
你可以尝试这样的事情:
df3 = df1.merge(df2, on='Number', how='left')
df3['Matching'] = np.where(df3.Productdetailed == df3.Item, 'Matched', 'No Match')
df3.drop('Productdetailed', axis=1, inplace=True)
这将返回您在问题中指出的输出。
澄清后编辑:
def find_match(row):
if (row.Number in df2.Number.values) & (row.Item in df2.Item.values):
return "MatchedBoth"
elif ((row.Number in df2.Number.values) & ~(row.Item in df2.Item.values)):
return "Matched Number Only"
else:
return "No Match"
df3['Matching'] = df3.apply(find_match, axis=1)
df3['Usage'] = df3.Item.map(df2.set_index('Item').Usage)
推荐阅读
- android - 我可以在我的安卓手机中使用霍尼韦尔安卓应用程序进行测试吗
- python - 参数作为我在 Python 3 中的预期列表
- php - PHP $_SERVER 变量来识别请求的文件
- ios - 领域平台数据未使用 Storyboard-Swift 4 加载到 TableView 中
- reactjs - 从 react js 传递天气和当前位置的信息
- c# - 如何在 Exression.Constant 中检查 null 和空字符串?
- html - 如何通过简单的 css 自定义日期选择器?
- reactjs - 与 React 一起使用时 Apollo 重新获取
- c# - 映射空值导致默认类型值(Automapper ADO.NET)
- ruby-on-rails - Rails 范围内的正则表达式未捕获正确的值