Python熊猫-不同类型的多索引列名可能存在问题

Python熊猫-不同类型的多索引列名可能存在问题,python,pandas,multi-index,Python,Pandas,Multi Index,以下代码导致异常:keyrerror:u'标签[37,5 cl]不在[列]中' df = pd.read_csv('https://raw.githubusercontent.com/AntoineGautier/Data/master/new.txt') df.rename({'1': 1, '3': 3, '0':0}, axis=1, inplace=True) df.set_index(list(df.columns[:3]), inplace=True) df.sort_index(i

以下代码导致异常:
keyrerror:u'标签[37,5 cl]不在[列]中'

df = pd.read_csv('https://raw.githubusercontent.com/AntoineGautier/Data/master/new.txt')
df.rename({'1': 1, '3': 3, '0':0}, axis=1, inplace=True)
df.set_index(list(df.columns[:3]), inplace=True)
df.sort_index(inplace=True)
for idx in df.index:
    tmp = df.loc[idx]

如果所有列名都是字符串,也不例外。

如果您在多索引上迭代,
idx
是一个元组,因此您应该使用
df.loc[list(idx)]
,这将给出预期的结果:

In [22]: df.loc[list(idx)]
Out[22]:
                                            5_x    5_y _merge  id_stock
1    3        0
1949 37,5 cl  Château LAFITE ROTHSCHILD   759.0  798.0   both        35
              Château LAFITE ROTHSCHILD   798.0  759.0   both        36
编辑:您也可以使用
df.loc[slice(idx)]
执行相同操作,进行比较

EDIT2:比较以下各项:

In [38]: tuple(idx)
Out[38]: (1949, '37,5 cl ', 'Ch\xc3\xa2teau LAFITE ROTHSCHILD ')

In [39]: (idx)
Out[39]: (1949, '37,5 cl ', 'Ch\xc3\xa2teau LAFITE ROTHSCHILD ')

In [40]: list(idx)
Out[40]: [1949, '37,5 cl ', 'Ch\xc3\xa2teau LAFITE ROTHSCHILD ']

In [41]: [idx]
Out[41]: [(1949, '37,5 cl ', 'Ch\xc3\xa2teau LAFITE ROTHSCHILD ')]

前两个不起作用,后两个不起作用。

您使用的是哪一个版本?您可以使用
pd查找。熊猫版本0.22.0使用元组进行选择应根据。奇怪的是,列表转换确实解决了这个问题…哦,是的,但是在那里你几乎总是有切片。。如果我找到更好的答案,我会阅读并扩展我的答案。在多索引数据帧上,使用列表定位实际上是不正确的。该列表仅解释为第一个键的一组值。Cf.:
df=pd.DataFrame({'a':[0,1,2],'b':[2,4,5],'val':['x','y','z']})
df.set_索引(['a','b'],inplace=True)
df.loc[[0,2]]
返回与键
a
的值
0
2
对应的两行,而
df.loc[(0,2)]
返回预期的第一行(尽管正确的语法相当于
df.loc[(0,2),:]
),但这并不完全正确。如果不是所有的元素都是整数,如果有些元素是字符串,则使用列表定位以获取具有该索引的唯一元素是有效的。否则就像你说的那样。在您的示例中,可以尝试
df.loc[[0,'2']]
,这很好。无论如何,我建议使用
df.loc[slice(idx)]
df.loc[[idx]]]
,它们都给出了预期的结果。
df.loc[slice(idx)]
不会引发任何异常,但不会返回与
idx
对应的行,而是从第一个索引到
idx
(with与
slice
的含义一致)。
df.loc[[idx]]
是可以的。
df.loc[idx,:]
在任何情况下都应该是可以的,并被视为首选语法。因此,已在此处提交错误报告: