Python Pandas动态生成复合键后唯一值计数异常求助
动态生成复合键唯一值计数异常的解决方案
你遇到的核心问题是:动态生成的df['Product_ID'] + df['VendorID']是字符串文本,不是可执行的代码。直接把这个字符串转成Series,得到的是仅包含这一个字符串的Series,所以唯一值数量必然是1——你根本没执行列拼接的操作。
正确的动态拼接方式(推荐,安全高效)
不需要拼接代码字符串,直接利用Pandas的内置方法动态处理列:
情况1:字符串拼接(和静态场景一致,把列值转为字符串后拼接)
# 假设df已经读取了Product_file.csv的数据 result_list = row[4].strip().split(',') # 把指定列的所有值转为字符串后按行拼接 df_concat = df[result_list].astype(str).agg(''.join, axis=1) # 统计唯一值 unique_key = df_concat.unique().size overall_key = df_concat.count()
情况2:数值相加(如果列是数值类型,直接按行求和)
result_list = row[4].strip().split(',') df_concat = df[result_list].sum(axis=1) unique_key = df_concat.unique().size overall_key = df_concat.count()
可选方案:执行字符串表达式(不推荐,有安全风险)
如果你一定要用生成的代码字符串,需要用eval()执行它来得到真正的Series:
# 先修复原代码的初始化问题,df_concat要先设为空字符串 result_list = row[4].strip().split(',') df_concat = '' # 初始化空字符串 i = 1 for col in result_list: if i == len(result_list): df_concat += f"df['{col}']" else: df_concat += f"df['{col}'] + " i += 1 # 执行字符串表达式,得到拼接后的Series df_concat_series = eval(df_concat) # 统计唯一值 unique_key = df_concat_series.unique().size overall_key = df_concat_series.count()
注意:
eval()会执行任意字符串代码,若result_list来自不可信来源,可能导致安全问题,优先推荐第一种方案。
原代码的其他问题
df_concat未初始化就直接拼接,运行会抛出NameError,必须先赋值为空字符串。- 循环逻辑冗余,可以直接遍历
result_list元素,不用额外的index和values变量。
内容的提问来源于stack exchange,提问作者Balaji Krishnamoorthy
相关产品推荐
相关产品推荐

