列表中DataFrame调用index方法报错,如何获取其索引?
问题:获取列表中DataFrame的索引报错
我有一个包含多个DataFrame的列表,想获取它们在列表中的索引。相关代码如下:
import pandas as pd import numpy as np I0 = pd.DataFrame({'Eng': [11], 'Fr': [10], 'It': [9], 'Sp': [11], 'Jp': [12] }) I1 = pd.DataFrame({'Eng': [9], 'Fr': [4], 'It': [9], 'Sp': [11], 'Jp': [15] }) I = [I0, I1]
执行I.index(I0)能正确返回0,但执行I.index(I1)时出现错误。我试过以下操作都没解决:
- 调换DataFrame在列表中的位置,错误依旧;
- 改用元组或集合替代列表,错误依旧;
- 调整列表中DataFrame的顺序,错误依旧。
想问有没有其他方法可以获取列表中DataFrame的索引?
解决方法
原因分析
列表的index()方法依赖元素的相等性判断,但Pandas的DataFrame直接用==判断时,会返回布尔值组成的DataFrame而非单个布尔值,导致index()无法正确匹配元素,从而报错。
可行方案
方案1:用DataFrame.equals()遍历匹配
Pandas提供了专门判断两个DataFrame是否完全相等的equals()方法,直接遍历列表匹配即可:
def get_df_index(df_list, target_df): for idx, df in enumerate(df_list): if df.equals(target_df): return idx return -1 # 未找到时返回-1 # 使用示例 print(get_df_index(I, I0)) # 输出0 print(get_df_index(I, I1)) # 输出1
方案2:通过哈希值匹配
计算每个DataFrame的哈希值,通过哈希值对比来确定索引:
import pandas.util.hash_pandas_object as hash_pd def get_df_index(df_list, target_df): target_hash = hash_pd(target_df).sum() for idx, df in enumerate(df_list): if hash_pd(df).sum() == target_hash: return idx return -1 # 使用示例 print(get_df_index(I, I0)) # 输出0 print(get_df_index(I, I1)) # 输出1
方案3:提前给DataFrame添加标识属性
如果可以提前处理DataFrame,给每个对象添加自定义属性标记索引,后续直接读取即可:
# 初始化时添加索引属性 I0._list_idx = 0 I1._list_idx = 1 I = [I0, I1] # 直接获取索引 print(I0._list_idx) # 输出0 print(I1._list_idx) # 输出1
内容的提问来源于stack exchange,提问作者Younes AT
相关产品推荐
相关产品推荐

