在R语言的DataFrame列表中提取各DataFrame的y列共有值
多DataFrame提取所有y列共有值的解决方案
直接用reduce(intersect, df_list)失效的核心原因是:intersect(pandas的pd.intersect)是按行维度做匹配,要求行的内容和位置完全对应,而非提取列值的集合交集——这和列长度、值的位置无关,本质是用错了方法。
正确思路是先把每个DataFrame的y列转成值集合,再求所有集合的交集:
- 遍历
df_list,提取每个DataFrame的y列并转成集合(自动去重,且不考虑顺序) - 用
reduce对所有集合做交集操作,得到所有列都存在的值 - 把最终集合转成列表,就是预期结果
代码实现
from functools import reduce import pandas as pd # 模拟你的df_list(实际使用时替换为自己的列表) df1 = pd.DataFrame({'y': ['apple', 'grape', 'banana']}) df2 = pd.DataFrame({'y': ['grape', 'apple', 'orange']}) df3 = pd.DataFrame({'y': ['apple', 'grape', 'mango']}) df4 = pd.DataFrame({'y': ['grape', 'apple', 'pear']}) df_list = [df1, df2, df3, df4] # 计算所有y列的共同值 common_y_values = reduce(lambda set_a, df: set_a & set(df['y']), df_list, set(df_list[0]['y'])) common_y_values = list(common_y_values) print(common_y_values) # 输出: ['apple', 'grape']
补充说明
- 若某个DataFrame的
y列有重复值,转成集合时会自动去重,不影响最终结果(只要值存在至少一次即符合条件) - 该方法完全不受DataFrame列长度、值的位置影响,仅关注值是否存在
内容的提问来源于stack exchange,提问作者toku_mo
相关产品推荐
相关产品推荐

