如何修改Pandas循环列代码,统计同时含两个指定值的行?
解决Pandas大数据集下跨列统计同时包含两个值的行的问题
需求说明
需要统计Pandas DataFrame中同一行任意列同时包含两个指定值的行数,现有代码仅能统计单值出现的次数,需修改循环逻辑满足需求;且因数据集规模过大,无法使用交叉表方法。
原代码
con = pd.read_csv("keyword connections.txt", sep="\t") key = pd.read_csv("keyword short list.txt", sep="\t") text_file = open("Output.txt", "w") i = 0 j = 0 k = 0 for i in range(0,key.size): name1 = key.iloc[i]["Keyword"] for j in range(0,key.size): name2 = key.iloc[j]["Keyword"] counts = 0 for col in con.columns: counts += len(con[(con[col]==name1)]) text_file.write(name1+"\t"+name2+"\t"+str(counts)+"\n") j += 1 k += 1 i += 1 text_file.close() print(k)
修改方案
原代码的问题在于:循环列统计单值行数会重复计数同一行(若一行多列含目标值),且未考虑两个值同时存在的条件。改用Pandas向量化操作替代循环列,既高效又能准确统计。
修改后的完整代码
import pandas as pd con = pd.read_csv("keyword connections.txt", sep="\t") key = pd.read_csv("keyword short list.txt", sep="\t") text_file = open("Output.txt", "w") k = 0 # 遍历所有关键词组合 for i in range(key.shape[0]): name1 = key.iloc[i]["Keyword"] for j in range(key.shape[0]): name2 = key.iloc[j]["Keyword"] # 判断每行是否同时包含name1和name2 if name1 == name2: # 若两个关键词相同,统计行内至少出现两次的行数 counts = (con == name1).sum(axis=1).ge(2).sum() else: # 若不同,统计行内同时存在两个关键词的行数 has_name1 = (con == name1).any(axis=1) has_name2 = (con == name2).any(axis=1) counts = (has_name1 & has_name2).sum() text_file.write(f"{name1}\t{name2}\t{counts}\n") k += 1 text_file.close() print(k)
关键修改点
向量化判断替代列循环:
(con == name1).any(axis=1):快速生成布尔Series,标记每行是否有任意一列等于name1- 两个布尔Series按位与后求和,直接得到同时满足条件的行数,避免重复计数
处理关键词相同的特殊情况:
当name1和name2为同一关键词时,统计行内至少出现两次该值的行数,避免误判仅出现一次的行移除冗余代码:
去掉for循环中手动递增的i += 1和j += 1,range迭代已自动处理索引
内容的提问来源于stack exchange,提问作者user26502206
相关产品推荐
相关产品推荐

