![](/img/trans.png)
[英]compare two seperate pandas dataframes row by row and return matching values
[英]Pandas: Check two dataframes for matching values, then fill a row depending on the label
在大学期间,我主要使用MATLAB作为数学专业,而我的编程只是建立数学方程式和建模。 现在我一直在学习使用Python,尤其是熊猫。 我正在尝试在一个数据框的一列中搜索值,并将它们与另一个数据框的一列中的值进行匹配。 如果它们确实匹配,我希望它们给原始数据框添加标签。
例如,我有第一列员工,我想在我的第一个数据帧中找出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
使用merge
:
df1.merge(df2.rename(columns={'col2': 'col3'}), on='col1')
col1 col2 col3
0 aliceA CO Non-Busy
1 aliceB WA Busy
2 aliceC PA Busy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.