为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas:检查两个数据框的匹配值,然后根据标签填充一行

Pandas:检查两个数据框的匹配值,然后根据标签填充一行

红颜莎娜 2021-06-04 15:50:31
我在大学期间主要使用 MATLAB 作为数学专业,我的编程只是构建数学方程和建模。现在我一直在学习使用 Python,尤其是 Pandas。我试图在一个数据帧的一列中搜索值,并将它们与不同数据帧的一列中的值进行匹配。如果它们匹配,我希望它们给原始数据框一个标签。例如,我有我的第一列员工,我想弄清楚 aliceB 在我的第一个数据框中是忙碌还是非忙碌,并在 col3 中进行标签。df1 = {"col1":["aliceA", "aliceB", "aliceC"], "col2":["CO", "WA", "PA"]}df1 = pd.DataFrame(df1)df1['col3'] = np.nanIn[]df1Out[]:      col1 col2  col30  aliceA   CO   NaN1  aliceB   WA   NaN2  aliceC   PA   NaNdf2 = {'col1': ["aliceB", "aliceA", "aliceC",  "bobC", "bobB", "bobA",], 'col2': ['Busy','Non-Busy','Busy','Non-Busy','Non-Busy','Busy']}df2 = pd.DataFrame(df2)In[]df2Out[]:      col1      col20  aliceB      Busy1  aliceA  Non-Busy2  aliceC      Busy3    bobC  Non-Busy4    bobB  Non-Busy5    bobA      Busy***Preferred Output***Out[]:      col1 col2      col30  aliceA   CO  Non-Busy1  aliceB   WA      Busy2  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 DataFramedf1Out[]:      col1 col2      col30  aliceA   CO  Non-Busy1  aliceB   WA      Busy2  aliceC   PA      Busy从技术上讲,此代码有效并且我的数据已填充,但我知道这可能不是解决我的问题的糟糕方法。对于这个小例子,它不会强迫我使用 Control+C,但是当我的 df1 有数千行长时它会这样做。
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

简单的 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


查看完整回答
反对 回复 2021-06-08
?
慕斯709654

TA贡献1840条经验 获得超5个赞

使用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


查看完整回答
反对 回复 2021-06-08
  • 2 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信