我正在使用最新的Anaconda下载Python 3.7.1和pandas 0.23.4
当数据是dict并且未传递索引时,系列索引将按dict的插入顺序排序
我从没有传递索引的dict实例化一个pandas DataFrame:
newspapers = {'Jim':{'Mon':15,'Tue':17,'Wed':21,'Thu':16,'Fri':19},\
'Tony':{'Mon':8,'Tue':15,'Wed':11,'Thu':16,'Fri':13}, \
'Colin':{'Mon':13,'Tue':17,'Wed':19,'Thu':17,'Fri':20} \
}
newspapers_df = pd.DataFrame(newspapers)
为什么这不按插入顺序显示,周一,周二,周三,周四,周五?:
print(newspapers_df)
输出:
Jim Tony Colin
Fri 19 13 20
Mon 15 8 13
Thu 16 16 17
Tue 17 15 17
Wed 21 11 19
这似乎是bug,对于我在python 3.5中工作,pandas 0.24.2在字典理解中创建Series
并传递给DataFrame
构造函数:
newspapers_df = pd.DataFrame({k:pd.Series(v) for k, v in newspapers.items()})
print (newspapers_df)
Jim Tony Colin
Mon 15 8 13
Tue 17 15 17
Wed 21 11 19
Thu 16 16 17
Fri 19 13 20
您的数据的可能解决方案 - DataFrame.reindex
或ordered CategoricalIndex
:
newspapers_df = pd.DataFrame(newspapers)
L = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
newspapers_df = newspapers_df.reindex(L)
要么:
newspapers_df.index = pd.CategoricalIndex(newspapers_df.index, ordered=True, categories=L)
newspapers_df = newspapers_df.sort_index()
print (newspapers_df)
Jim Tony Colin
Mon 15 8 13
Tue 17 15 17
Wed 21 11 19
Thu 16 16 17
Fri 19 13 20
使用numpy.argsort()可以完成相同的排序:
days_dict = {'Mon':0, 'Tue':1,'Wed':2,'Thu':3,'Fri':4,'Sat':5,'Sun':6}
df = pd.DataFrame(newspapers).reset_index()
df.iloc[np.argsort(df['index'].map(days_dict)),:]
看起来pd.Series和pd.DataFrame有不同的方式来处理这种情况。
我有类似的python环境,结果可以在我的电脑中复制。此外,Jezrel的pd.Series案例可以在我的计算机中复制。
我检查了手册,发现两个结果都是按照文档进行的。
对于系列,键是索引当数据是dict,并且未传递索引时,如果您使用的是Python版本> = 3.6且Pandas版本> = 0.23,则系列索引将按dict的插入顺序排序。
对于数据框:键是列。如果未传递轴标签,则将根据常识规则从输入数据构造它们。
注意当数据是dict且未指定列时,如果使用的是Python版本> = 3.6且Pandas> = 0.23,则数据框架列将按dict的插入顺序排序。
这意味着,如果要确保列和索引排序,您可能需要传递索引或稍后对它们进行排序。
希望它能回答你的问题。