python - Pandas:检查两个数据框的匹配值,然后根据标签填充一行
问题描述
在整个大学期间,我主要使用 MATLAB 作为数学专业,而我的编程只是构建数学方程和建模。现在我一直在学习使用 Python,尤其是 pandas。我正在尝试在一个数据框的列中搜索值,并将它们与不同数据框的列中的值匹配。如果他们匹配,我希望他们给原始数据框一个标签。
例如,我有我的第一列员工,我想在我的第一个数据框中找出 aliceB 是忙还是非忙,并在 col3 中进行标记。
df1 = {"col1":["aliceA", "aliceB", "aliceC"], "col2":["CO", "WA", "PA"]}
df1 = pd.DataFrame(df1)
df1['col3'] = np.nan
In[]df1
Out[]:
col1 col2 col3
0 aliceA CO NaN
1 aliceB WA NaN
2 aliceC PA NaN
df2 = {'col1': ["aliceB", "aliceA", "aliceC", "bobC", "bobB", "bobA",], 'col2': ['Busy','Non-Busy','Busy','Non-Busy','Non-Busy','Busy']}
df2 = pd.DataFrame(df2)
In[]df2
Out[]:
col1 col2
0 aliceB Busy
1 aliceA Non-Busy
2 aliceC Busy
3 bobC Non-Busy
4 bobB Non-Busy
5 bobA Busy
***Preferred Output***
Out[]:
col1 col2 col3
0 aliceA CO Non-Busy
1 aliceB WA Busy
2 aliceC PA Busy
对于这种问题 MATLAB,我将使用我的两个矩阵并使用嵌套的 for 循环进行迭代以查找值。在Python中我做了:
for i in range(0, df2.shape[0]):
for j in range(0, df1.shape[0]):
if(df2.col1[i] == df1.col1[j]):
df1.col3[j] = df2.col2[i]
但是我收到了这个警告,我必须 Control + C 才能摆脱它继续:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
df1
Out[]:
col1 col2 col3
0 aliceA CO Non-Busy
1 aliceB WA Busy
2 aliceC PA Busy
从技术上讲,此代码有效并且我的数据已填写,但我知道这可能是解决我的问题的糟糕方法。对于这个小例子,它不会强迫我使用 Control+C,但是当我的 df1 有数千行长时它会这样做。
解决方案
简单的map
df1.col3=df1.col1.map(df2.set_index('col1').col2)
df1
Out[31]:
col1 col2 col3
0 aliceA CO Non-Busy
1 aliceB WA Busy
2 aliceC PA Busy
推荐阅读
- c# - 有条件地自动编号发货(即在创建之前更改发货编号)
- next.js - 简单的 getServerSideProps 不起作用
- laravel - 检查laravel中的空输入字段
- c# - Acumatica:根据字段的初始值或字段值更改时设置按钮的初始标签
- android - Viewpager 与 ViewPager2 之间有什么好处或差异
- servlets - 使用来自 csv 的输入在 AEM 中动态创建页面
- android - 无法在 android 11 中写入和打开文件
- java - Java Socket 仅第一次发送数据
- daml - '$' 运算符是什么?
- ios - 如何在 Swift 中完成所有单元格数据加载之前不显示 tableView