基于DataFrame A与B的列匹配在B中创建新列并排序时遇ValueError问题求助
ValueError: The truth value of a DataFrame is ambiguous问题 问题场景
你想要把DataFrame A里reason_name和Yes/No/Unfinished列的映射关系,匹配到DataFrame B(也就是你的aggregated_call_logs_df)的同名列上,新增donation_status列,最后还要按日期、时间升序排序。但用map直接传入整个DataFrame时触发了报错。
错误原因
你现在的代码是直接把整个mapping_reason_name_donation_status_df(也就是DataFrame A)传给了map方法,但map只接受字典、Series或者可调用对象作为映射规则。传入整个DataFrame的话,Pandas无法确定怎么用这个DataFrame来做映射匹配,所以抛出了“真值歧义”的错误。
解决方案
先把DataFrame A转换成符合要求的映射结构,再执行映射和排序:
构建映射字典/Series
假设你的DataFrame A(mapping_reason_name_donation_status_df)的结构是:reason_name列作为键,Yes/No/Unfinished列作为对应的值。先把它转换成字典:# 构建reason_name到状态值的映射字典 status_mapping = mapping_reason_name_donation_status_df.set_index('reason_name')['Yes/No/Unfinished'].to_dict()或者转换成Series(效果一样,Pandas的
map也支持Series):status_mapping = mapping_reason_name_donation_status_df.set_index('reason_name')['Yes/No/Unfinished']执行映射操作
用上面构建好的映射来给DataFrame B新增列:aggregated_call_logs_df["donation_status"] = aggregated_call_logs_df['reason_name'].map(status_mapping)按日期和时间升序排序
最后替换成你实际的日期、时间列名,执行排序:# 替换成你DataFrame里实际的日期列名和时间列名 aggregated_call_logs_df = aggregated_call_logs_df.sort_values(by=['date_column', 'time_column'], ascending=True)
额外注意事项
你已经把NaN填充为空字符串,要确保映射字典里的reason_name包含所有DataFrame B中出现的空字符串情况,否则映射后donation_status会出现NaN,可以用fillna再处理一次:
aggregated_call_logs_df["donation_status"] = aggregated_call_logs_df['reason_name'].map(status_mapping).fillna('Unfinished') # 或者你需要的默认值
内容的提问来源于stack exchange,提问作者Shihab Ullah

