我想在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 .

推荐答案

如果我理解正确的话,你的问题是关于这个作业(job):

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"])
df.loc[this_index, 'value']=0

您可以使用列或索引的列表来解决此问题:

df.loc[this_index, ['value']] = 0

# or
df.loc[[this_index], 'value'] = 0

输出:

                                             value
(foo, (spam,)) (bar, (egg,)) (baz, (bacon,))     0
                             (pam, (bacon,))   NaN

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

在Python中处理大量CSV文件中的数据

如何列举Pandigital Prime Set

如何创建一个缓冲区周围的一行与manim?

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

如何在Polars中从列表中的所有 struct 中 Select 字段?

如何在Python中获取`Genericums`超级类型?

在Python中调用变量(特别是Tkinter)

网格基于1.Y轴与2.x轴显示在matplotlib中

以逻辑方式获取自己的pyproject.toml依赖项

如何创建引用列表并分配值的Systemrame列

Gekko中基于时间的间隔约束

pandas:在操作pandora之后将pandora列转换为int

如何将一组组合框重置回无 Select tkinter?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

EST格式的Azure数据库笔记本中的当前时间戳

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

Sknowled线性回归()不需要迭代和学习率作为参数