如何在Python中获取DataFrame或CSV文件所有列的共有值列表
获取Pandas所有列的共有值
原始DataFrame
import pandas as pd df = pd.DataFrame({ 'colA': ['aa', 'bb', 'cc', 'dd', 'ee'], 'colB': ['aa', 'bb', 'dd', 'qq', 'ee'], 'colC': ['aa', 'bb', 'cc', 'ee', 'dd'], 'colD': ['aa', 'bb', 'ee', 'cc', 'dd'] })
需求目标
提取所有列中都存在的共有值,期望输出为列表['aa', 'bb', 'dd', 'ee']或对应的单列DataFrame。
你尝试的代码(存在逻辑问题)
import pandas as pd df = pd.read_csv('Bus Names Concat test.csv') # 读取输入CSV文件 df = df.stack().value_counts() core_list = df[df>2].index.tolist() # 硬编码筛选出现次数>2的值 print(len(core_list)) df_core = pd.DataFrame(core_list) print(df_core)
问题分析:用固定阈值df>2筛选完全错误——共有值的判定标准是在每一列都存在,而非出现次数大于某个数。比如例子中cc出现3次,但并没有在colB中存在,会被误选;而硬编码的阈值也无法适配列数变化的场景。
正确解决方案
方法1:利用集合交集(简洁高效)
把每列的唯一值转为集合,再求所有集合的交集,直接得到所有列的共有值:
# 生成每列的唯一值集合 column_sets = [set(df[col]) for col in df.columns] # 计算所有集合的交集 common_list = list(set.intersection(*column_sets)) # 转为DataFrame(如果需要) common_df = pd.DataFrame(common_list, columns=['col']) print("共有值列表:", common_list) print("共有值DataFrame:") print(common_df)
输出结果:
共有值列表: ['aa', 'bb', 'dd', 'ee'] 共有值DataFrame: col 0 aa 1 bb 2 dd 3 ee
方法2:用Pandas的isin+all逐值验证
遍历所有唯一值,检查该值是否在每一列都存在:
# 获取所有非重复值 all_unique_values = pd.unique(df.values.ravel()) # 筛选在所有列都存在的值 common_list = [val for val in all_unique_values if df.isin([val]).all().all()] common_df = pd.DataFrame(common_list, columns=['col']) print(common_list) print(common_df)
方法3:统计值出现的列数(适配含重复值的场景)
如果数据中存在重复值,可统计每个值出现在多少个不同列中,筛选出列数等于总列数的值:
stacked_data = df.stack() # 统计每个值出现的不同列数 value_col_count = stacked_data.groupby(stacked_data).apply(lambda x: x.index.get_level_values(1).nunique()) # 筛选出在所有列都出现的值 common_list = value_col_count[value_col_count == len(df.columns)].index.tolist() common_df = pd.DataFrame(common_list, columns=['col']) print(common_list) print(common_df)
内容的提问来源于stack exchange,提问作者Y. Pat
相关产品推荐
相关产品推荐

