如何获取多个(两个以上)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
相关产品推荐
相关产品推荐

