请求编写Pandas映射检查函数:校验Country与Bottle_Weight全映射
解决方案:基于首个国家校验Bottle_Weight映射情况
嘿,我来帮你搞定这个问题!看你给出的三个DataFrame案例,我完全明白你想要实现的逻辑——以第一个国家的Bottle_Weight唯一值作为基准,校验其他国家的重量映射情况:既要检查是否有基准重量没被其他国家覆盖,也要留意其他国家是否新增了基准外的重量。
先把你的数据初始化代码放出来,方便后续测试:
import pandas as pd # 初始化三个测试DataFrame data1 = [['India', 350], ['India', 600], ['Bangladesh', 350],['Bangladesh', 600]] df1 = pd.DataFrame(data1, columns = ['Country', 'Bottle_Weight']) data2 = [['India', 350], ['India', 600],['India', 200], ['Bangladesh', 350],['Bangladesh', 600]] df2 = pd.DataFrame(data2, columns = ['Country', 'Bottle_Weight']) data3 = [['India', 350], ['India', 600], ['Bangladesh', 350],['Bangladesh', 600],['Bangladesh', 200]] df3 = pd.DataFrame(data3, columns = ['Country', 'Bottle_Weight'])
接下来是实现需求的函数,我给每一步都加了注释,方便你理解逻辑:
def check_bottle_mapping(df): # 获取所有唯一国家列表 unique_countries = df['Country'].unique() if len(unique_countries) < 2: return "仅存在一个国家,无需校验映射情况" # 以第一个国家的Bottle_Weight唯一值作为基准集合 base_country = unique_countries[0] base_weights = set(df[df['Country'] == base_country]['Bottle_Weight'].unique()) result = [] # 第一步:检查是否所有国家都覆盖了基准重量集合 all_base_covered = True for country in unique_countries: country_weights = set(df[df['Country'] == country]['Bottle_Weight'].unique()) if not base_weights.issubset(country_weights): all_base_covered = False break if all_base_covered: result.append("所有'Bottle_Weight'的唯一值均已与所有唯一Country完成映射") # 第二步:遍历其他国家,检查是否有基准外的新增重量 for country in unique_countries[1:]: country_weights = set(df[df['Country'] == country]['Bottle_Weight'].unique()) extra_weights = country_weights - base_weights if extra_weights: result.append(f"'{country}'映射了新值{', '.join(map(str, extra_weights))}") # 第三步:如果有国家没覆盖基准重量,补充提示缺失项 if not all_base_covered: for country in unique_countries[1:]: country_weights = set(df[df['Country'] == country]['Bottle_Weight'].unique()) missing_weights = base_weights - country_weights if missing_weights: result.append(f"'{country}'未与'Bottle_Weight'的{', '.join(map(str, missing_weights))}完成映射") # 把结果按换行拼接后返回 return '\n'.join(result)
现在来测试这个函数,完全符合你想要的结果:
# 测试df1 print("df1的校验结果:") print(check_bottle_mapping(df1)) # 输出:所有'Bottle_Weight'的唯一值均已与所有唯一Country完成映射 # 测试df2 print("\ndf2的校验结果:") print(check_bottle_mapping(df2)) # 输出:'Bangladesh'未与'Bottle_Weight'的200完成映射 # 测试df3 print("\ndf3的校验结果:") print(check_bottle_mapping(df3)) # 输出: # 所有'Bottle_Weight'的唯一值均已与所有唯一Country完成映射 # 'Bangladesh'映射了新值200
这个函数的灵活性还不错,就算后续增加更多国家或者重量值,也能自动适配校验逻辑~
内容的提问来源于stack exchange,提问作者freak7
相关产品推荐
相关产品推荐

