为何Pandas多索引下loc会返回单行DataFrame而非Series?
Pandas多索引loc查询返回类型不一致问题
我有两个从CSV读取的、带有(str, int)类型多索引的DataFrame:
data1 = pd.read_csv(file1, sep=";", index_col=['pdf_name', 'page']) data2 = pd.read_csv(file2, sep=";", index_col=['pdf_name', 'page']) idx = data1.index[0] # 首个索引:('0147S00044', 0) data1.loc[idx] # 如预期返回Series data2.loc[idx] # 返回1×N的DataFrame data2['col1'].loc[idx] # 返回含1个值的Series data2.loc[idx[0]].loc[idx[1]] # 返回Series——这与直接用data2.loc[idx]有何不同? data2['col1'].loc[idx[0]].loc[idx[1]] # 返回实际值
Pandas文档描述的是data1的行为,符合预期,但data2的表现却不符合预期。
可复现示例
import pandas as pd from io import StringIO file1 = StringIO("pdf_name;page;col1;col2\npdf1;0;val1;val2\npdf2;0;asdf;ffff") file2 = StringIO("pdf_name;page;col1;col2\npdf1;0;;\npdf2;0;;\npdf2;0;;") data1 = pd.read_csv(file1, sep=";", index_col=['pdf_name', 'page']) data2 = pd.read_csv(file2, sep=";", index_col=['pdf_name', 'page']) data2 = data2.sort_index() # 避免性能警告 idx = data1.index[0] print(idx) # ('pdf1', 0) print("data1.loc[idx]", type(data1.loc[idx])) # data1.loc[idx] <class 'pandas.core.series.Series'> print("data2.loc[idx]", type(data2.loc[idx])) # data2.loc[idx] <class 'pandas.core.frame.DataFrame'> print("data2.loc[idx].shape", data2.loc[idx].shape) # (1, 2) -- 单行 print("data2['col1'].loc[idx]", type(data2['col1'].loc[idx])) # data2['col1'].loc[idx] <class 'pandas.core.series.Series'>
我发现只要数据集存在至少两行重复索引,即使查询的索引本身没有重复,也会出现这种情况。这是Pandas的预期行为吗?
内容的提问来源于stack exchange,提问作者N4ppeL
相关产品推荐
相关产品推荐

