我有一个像这样的数据框列表:
arr = [df1, df2, df3]
我想在这个列表中找到元素的位置:
position_of_df2 = arr.index(df2)
但是python在这一行上给出错误:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我做错了什么? PS获取数组中数据帧索引的最佳方法是什么?只迭代?
答案 0 :(得分:1)
list.index
通过使用列表中的元素检查输入的相等并查找True
。然后它返回第一个匹配的索引。
测试2个数据帧的相等性会返回一个数据帧:
df1 = pd.DataFrame([[1, 2]])
df2 = pd.DataFrame([[1, 2]])
print(df1 == df2)
0 1
0 True True
结果的真实性含糊不清:
print(bool(df1 == df2))
# ValueError: The truth value of a DataFrame is ambiguous.
# Use a.empty, a.bool(), a.item(), a.any() or a.all().
选项1
在我看来,检查您是否拥有正确数据框架的最佳方法是使用有序字典并定义密钥(最好使用描述性名称作为密钥):
from collections import OrderedDict
o = OrderedDict([(1, df1), (2, df2), (3, df3)])
print(list(o.keys()).index(2)) # 1
选项2
使用带is
的生成器表达式,仅当2个变量指向同一个对象时才返回True
:
lst = [df1, df2, df3]
res = next(i for i, j in enumerate(lst) if j is df2) # 1
答案 1 :(得分:1)
基于上面@jpp的答案,同样引用答案https://stackoverflow.com/a/19918849/423725,即兴创作解决方案。
df1 = pandas.DataFrame([1, 2])
df2 = pandas.DataFrame([3, 4])
df3 = pandas.DataFrame([5, 6])
arr = [df1, df2, df3]
def isEqual(df1, df2):
from pandas.util.testing import assert_frame_equal
try:
assert_frame_equal(df1, df2)
return True
except: # appeantly AssertionError doesn't catch all
return False
def indexDF(df, arr):
for index, dataframe in enumerate(arr):
if isEqual(df, dataframe):
return index
indexDF(df2, arr)
# 1