如何在元组索引的DataFrame中获取单行数据?
问题描述
我创建了这样一个pandas DataFrame:
import pandas as pd f = pd.DataFrame.from_dict({"r0":{"c0":1,"c1":2},("r",1):{"c0":3,"c1":4}},orient="index")
输出的DataFrame如下:
c0 c1 r0 1 2 (r, 1) 3 4
我可以用list(f.loc["r0"].items())获取第一行,得到[('c0', 1), ('c1', 2)],但用f.loc[("r",1)]获取第二行时会抛出KeyError。我尝试了list(f.loc[[("r",1)]].iloc[0].items())这种繁琐的方式实现,想知道有没有更简洁的正确做法?另外,我不想使用MultiIndex。
解决方案
出现这个问题的原因是:当索引中混合了字符串和元组类型时,pandas的loc在直接查找元组索引时,可能会误将其当作MultiIndex的层级参数处理,从而抛出KeyError。以下是两种更简洁的解决方法:
- 使用
index.get_loc()获取位置后用iloc
通过f.index.get_loc(("r",1))拿到目标索引对应的行位置,再用iloc获取整行,最后转成键值对列表:
list(f.iloc[f.index.get_loc(("r",1))].items()) # 输出:[('c0', 3), ('c1', 4)]
- 用
squeeze()简化你的原有方法
你的原有方法可以通过squeeze()将单行DataFrame转为Series,省去iloc[0]的步骤:
list(f.loc[[("r",1)]].squeeze().items()) # 输出:[('c0', 3), ('c1', 4)]
另外需要注意:确保你传入的元组与索引中的元组完全一致(比如元素的类型、内容,元组的括号和逗号格式),可以通过print(f.index)查看索引的具体内容,确认匹配后再进行查找。
内容的提问来源于stack exchange,提问作者sds
相关产品推荐
相关产品推荐

