我想在Pandas中使用MultiIndex,在每个级别上我都有一个嵌套的元组.我知道我原则上可以打开包装的东西,但这将是不太清晰和恼人的.一般来说,元组的元素(一个类名和一些参数)只有在一起才有意义,我想让它更难以无意义的对结束,元组有不同的长度,我想使用MultiIndex.from_product.
在创建DataFrame和访问值时,一切工作正常,但在写入时,我得到了意想不到的结果.
在一个简单的例子中,下面的代码:
import pandas as pd
index=pd.MultiIndex.from_arrays([[("foo","spam"),("foo","spam")],[("bar","egg"),("bar","egg")],[("baz","bacon"),("pam","bacon")]])
this_index = (("foo","spam"),("bar","egg"),("baz","bacon"))
df = pd.DataFrame(index=index, columns=["value"])
print(df)
print(df.loc[this_index])
df.loc[this_index]=0
# df.loc[this_index,"value"]=0
print(df)
首先打印我想要的表(三个元组作为索引,列值中有NAN),然后打印正确检索到的值NaN,但在最后一行显示两个额外的列,名为"bar"和"egg",均设置为0:
value bar egg
(foo, spam) (bar, egg) (baz, bacon) 0 0.0 0.0
(pam, bacon) NaN NaN NaN
在这种情况下,使用注释行进行赋值会得到预期的结果.
然而,在我的例子中,我还需要"spam"、"egg"和"bacon"作为元组. 如果我更改上述代码中的第2行和第3行,则将:
index=pd.MultiIndex.from_arrays([[("foo",("spam",)),("foo",("spam",))],[("bar",("egg",)),("bar",("egg",))],[("baz",("bacon",)),("pam",("bacon",))]])
this_index = (("foo",("spam",)),("bar",("egg",)),("baz",("bacon",)))
我在前两个 fingerprint 中又有了预期的行为,第三个 fingerprint 给出了(现在不知何故预期的):
value bar (egg,)
(foo, (spam,)) (bar, (egg,)) (baz, (bacon,)) 0 0.0 0.0
(pam, (bacon,)) NaN NaN NaN
但try 上述相同的解决方法会带来以下好处:
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (3, 2) + inhomogeneous part.
我找不到任何方法来改编这个把戏.
目前我发现的最好的解决办法是对元组使用str(),然后根据需要再次解析内容,但我觉得应该有更好的方法.我在这里找到的唯一痕迹是一条对this answer的未回复 comments .