如何在pandas中根据Tax_Term匹配结果填充对应列的Tax_Amount值?
解决Pandas按条件填充列的问题
现有DataFrame
Tax_Amount Rate SGST CGST IGST TDS Tax_Term 0 5697.0 9.0 NaN NaN NaN NaN CGST 1 954.0 9.0 NaN NaN NaN NaN TDS 2 1305.0 9.0 NaN NaN NaN NaN CGST 3 2724.0 9.0 NaN NaN NaN NaN SGST 4 18000.0 9.0 NaN NaN NaN NaN IGST
需求
当Tax_Term列的值与SGST、CGST、IGST、TDS列名匹配时,将对应行的Tax_Amount值填入该列。
预期输出
Tax_Amount Rate SGST CGST IGST TDS Tax_Term 0 5697.0 9.0 NaN 5697.0 NaN NaN CGST 1 954.0 9.0 NaN 954.0 NaN 954.0 TDS 2 1305.0 9.0 NaN 1305.0 NaN NaN CGST 3 2724.0 9.0 2724.0 NaN NaN NaN SGST 4 18000.0 9.0 NaN NaN 18000.0 NaN IGST
尝试的代码(未达预期)
final_df['SGST'] = final_df.query('Tax_Term == SGST')['Tax_Amount'] final_df['CGST'] = final_df.query('Tax_Term == CGST')['Tax_Amount'] final_df['IGST'] = final_df.query('Tax_Term == IGST')['Tax_Amount'] final_df['TDS'] = final_df.query('Tax_Term == TDS')['Tax_Amount']
解决方案
你这段代码的问题有两个:一是query语句里的列名没有加引号,无法正确匹配字符串;二是直接赋值会导致非匹配行被覆盖为NaN,破坏原有数据结构。以下两种方法可以实现需求:
方法一:循环+loc精准赋值
遍历目标列,针对每个列名匹配Tax_Term的行,将Tax_Amount的值填入对应列:
import pandas as pd # 假设你的DataFrame是final_df tax_cols = ['SGST', 'CGST', 'IGST', 'TDS'] for col in tax_cols: final_df.loc[final_df['Tax_Term'] == col, col] = final_df['Tax_Amount']
方法二:get_dummies生成哑变量(更简洁)
通过哑变量标记匹配行,再和Tax_Amount相乘得到对应值,最后替换原列:
import pandas as pd tax_cols = ['SGST', 'CGST', 'IGST', 'TDS'] # 生成哑变量并乘以Tax_Amount得到对应值 dummy_vals = pd.get_dummies(final_df['Tax_Term'])[tax_cols] * final_df['Tax_Amount'] # 替换原列 final_df[tax_cols] = dummy_vals
这两种方法都能准确将Tax_Amount填入匹配的列中,得到你想要的结果。
内容的提问来源于stack exchange,提问作者Paras
相关产品推荐
相关产品推荐

