You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取多个(两个以上)Pandas DataFrame的共同列名?

解决多Pandas DataFrame取共同列名的报错问题

问题场景

想要获取三个DataFrame(meth_kirp、mrna_kirp、cna_kirp)的共同列名,尝试用np.intersect1d实现,代码如下:

np.intersect1d(meth_kirp.columns, mrna_kirp.columns, cna_kirp.columns)

报错信息

运行后触发以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_27/1139729657.py in <module>
----> 1 np.intersect1d(meth_kirp.columns, mrna_kirp.columns, cna_kirp.columns)

<__array_function__ internals> in intersect1d(*args, **kwargs)

/opt/conda/lib/python3.7/site-packages/numpy/lib/arraysetops.py in intersect1d(ar1, ar2, assume_unique, return_indices)
    433     ar2 = np.asanyarray(ar2)
    434 
--> 435     if not assume_unique:
    436         if return_indices:
    437             ar1, ind1 = unique(ar1, return_index=True)

/opt/conda/lib/python3.7/site-packages/pandas/core/indexes/base.py in __nonzero__(self)
   2808     def __nonzero__(self):
   2809         raise ValueError(
--> 2810             f"The truth value of a {type(self).__name__} is ambiguous. "
   2811             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   2812         )

ValueError: The truth value of a Index is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

报错原因

np.intersect1d仅接受两个数组作为前两个位置参数,第三个参数是assume_unique(布尔类型,用于指定输入数组是否已去重)。你传入的第三个参数是cna_kirp.columns(Pandas的Index对象),被误当作assume_unique参数,而Index对象无法直接判断布尔值,因此触发歧义报错。

解决方案

方法1:嵌套使用np.intersect1d

通过多次调用逐步计算交集:

import numpy as np

# 先取前两个DataFrame的列名交集,再和第三个取交集
common_cols = np.intersect1d(np.intersect1d(meth_kirp.columns, mrna_kirp.columns), cna_kirp.columns)

方法2:利用集合的交集操作

将列名转为集合,用&运算符直接计算多集合交集,按需转回对应类型:

# 转为集合取交集后转回列表
common_cols = list(set(meth_kirp.columns) & set(mrna_kirp.columns) & set(cna_kirp.columns))

# 若需保持Pandas Index类型,用Index自带的intersection方法
common_cols = meth_kirp.columns.intersection(mrna_kirp.columns).intersection(cna_kirp.columns)

方法3:通用化处理任意数量的DataFrame

如果需要处理更多DataFrame,用functools.reduce批量计算交集:

from functools import reduce
import numpy as np

# 把所有DataFrame的列名存入列表
all_columns = [meth_kirp.columns, mrna_kirp.columns, cna_kirp.columns]
# 批量计算多数组交集
common_cols = reduce(np.intersect1d, all_columns)

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:25:19