如何不合并Pandas DataFrame,通过条件判断填充df1指定列?
不合并Pandas DataFrame,按条件填充列的解决方案
问题场景
现有两个Pandas DataFrame:
- df1包含
supplier列,已新增空列new_client和buyer - df2包含
company_name和status列
需求:不合并/连接两个DataFrame,通过条件判断填充df1:
- 当df2的
company_name与df1的supplier匹配且status为Purchased时,将df1对应行的buyer设为Yes - 当
status为Registered时,将new_client设为Yes
用户尝试的代码触发TypeError: 无法对dtype为[object]的数组与类型为[bool]的标量执行'rand_'操作错误,以下是正确实现方法。
原始示例代码
import pandas as pd df1 = pd.DataFrame({'supplier': ['Interiors 365', 'Smart Builders', 'Architects Ltd', 'Builders Limited', 'Demolition Company']}) df1.insert(1, column='new_client', value='') df1.insert(2, column='buyer', value='') df2 = pd.DataFrame({'company_name': ['Smart Builders', 'Architects Ltd', 'London Construction', 'Builders Limited', 'Demolition Company', 'Brighton Scaffolding'], 'status': ['Purchased', 'Registered', 'Registered', 'Registered', 'Purchased', 'Purchased']}, columns=['company_name', 'status'])
用户错误代码及原因
错误代码1
#This doesn't check if the company name is the same df1.loc[df2['status'] == 'Purchased', 'buyer'] = 'Yes' (df2['company_name'] and df1['supplier'])
- 语法错误,额外的括号逻辑无效
- 直接用df2的布尔索引定位df1行,会因两个DataFrame行数不一致(df1有5行,df2有6行)导致错误匹配
错误代码2
df1.loc[df2['status'] == 'Purchased' & df2['company_name'] == df1['supplier'], 'buyer'] = 'Yes'
- 运算符优先级错误:
&的优先级高于==,会先执行'Purchased' & df2['company_name'],字符串与object数组的按位与操作触发类型错误 df2['company_name'] == df1['supplier']会因行数不一致触发广播错误,无法正确匹配公司名称
正确实现代码
通过提取df2中符合条件的公司集合,再用isin()方法匹配df1的supplier列,无需合并DataFrame:
# 从df2中提取符合条件的公司集合(集合查询效率高于列表) purchased_companies = set(df2[df2['status'] == 'Purchased']['company_name']) registered_companies = set(df2[df2['status'] == 'Registered']['company_name']) # 填充buyer列:匹配Purchased状态的公司 df1.loc[df1['supplier'].isin(purchased_companies), 'buyer'] = 'Yes' # 填充new_client列:匹配Registered状态的公司 df1.loc[df1['supplier'].isin(registered_companies), 'new_client'] = 'Yes' # 输出结果 print(df1)
执行结果
supplier new_client buyer 0 Interiors 365 1 Smart Builders Yes 2 Architects Ltd Yes 3 Builders Limited Yes 4 Demolition Company Yes
方案优势
- 无需合并DataFrame,避免了合并带来的数据冗余或索引混乱
- 集合的查询效率更高,适合数据量较大的场景
- 逻辑清晰,直接通过公司名称匹配填充,避免行数不一致导致的错误
内容的提问来源于stack exchange,提问作者ola
相关产品推荐
相关产品推荐

