Python2.7中如何查找DataFrame行内公共元素及行内极值
解决方案:处理DataFrame每行的重复元素、最小/最大值
嘿,我来帮你搞定这个问题!Pandas确实没有直接的内置函数一步实现你要的所有功能,但我们可以结合apply()和一些基础的Python工具轻松搞定,而且完全支持任意列数的场景哦。
先回顾你的示例数据
首先,先把你的示例代码跑一遍,明确数据情况:
import pandas as pd df = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[2,1,3]}) print(df)
输出结果是:
col1 col2 col3 0 1 2 2 1 2 3 1 2 3 4 3
1. 提取每行的重复元素(也就是你说的“公共元素”)
你要的是每行中出现至少两次的元素对吧?我们可以写一个自定义小函数,对每行统计元素出现频率,筛选出重复的:
def get_common_elements(row): # 统计每行里每个元素的出现次数 element_counts = row.value_counts() # 挑出出现次数≥2的元素,转成列表返回 common_elements = element_counts[element_counts >= 2].index.tolist() # 如果没有重复元素就返回None,也可以改成空列表[] return common_elements if common_elements else None # 把这个函数应用到DataFrame的每一行,生成新列 df['common_elements'] = df.apply(get_common_elements, axis=1)
2. 计算每行的最小值和最大值
这个就简单多了,直接用Pandas自带的按行计算方法:
df['row_min'] = df.min(axis=1) df['row_max'] = df.max(axis=1)
最终结果
运行完上面的代码后,你的DataFrame会变成这样:
col1 col2 col3 common_elements row_min row_max 0 1 2 2 [2] 1 2 1 2 3 1 None 1 3 2 3 4 3 [3] 3 4
完全符合你的需求:第0行的公共元素是2,第2行是3,每行的最小最大值也都准确计算出来了。
支持任意n列的情况
这个方案完全不限制列数,不管你的DataFrame有3列还是10列,apply()都会遍历每一行,value_counts()也会自动处理所有列的元素,直接套用就行。
额外小优化:只取第一个重复出现的元素
如果你不需要所有重复元素,只想要第一个出现的重复项,可以修改一下函数:
def get_first_common_element(row): seen = set() for num in row: if num in seen: return num seen.add(num) return None df['first_common_element'] = df.apply(get_first_common_element, axis=1)
这样第0行返回2,第2行返回3,第1行因为没有重复元素就返回None啦。
内容的提问来源于stack exchange,提问作者Chetan.B
相关产品推荐
相关产品推荐

