我正在使用最近下载的带有Python 3.7.1和pandas 0.23.4的Anaconda
当数据为字典且未传递索引时,系列索引将按照字典的插入顺序进行排序
我从没有传递索引的字典中实例化了一个熊猫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
答案 0 :(得分:1)
对于我在python 3.5中工作的熊猫来说,这似乎是一个错误,它在字典理解中以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
答案 1 :(得分:1)
可以使用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)),:]
答案 2 :(得分:0)
查找pd.Series和pd.DataFrame有不同的处理方式。
我有类似的python环境,结果可以在我的计算机中复制。而且,Jezrel的pd.Series盒可以在我的计算机中复制。
我检查了手册,发现两个结果都与文档一致。
对于系列,键为索引 当数据是字典且未传递索引时,如果您使用的是Python版本> = 3.6,系列索引将按照字典的插入顺序排序和熊猫版本> = 0.23。
对于数据框:键为列。 如果未通过轴标签,则会基于常识规则从输入数据中构建它们。
注意:当数据是字典且未指定列时,如果您使用的Python版本> = 3.6和Pandas> = 0.23,则 DataFrame列将按字典的插入顺序排序。
这意味着,如果要确保列和索引都排序,则可能需要传递索引或稍后对其进行排序。
希望它能回答您的问题。