从字典和索引顺序创建DataFrame?

时间:2019-03-28 12:03:25

标签: pandas dictionary python-3.7

我正在使用最近下载的带有Python 3.7.1和pandas 0.23.4的Anaconda

pandas doc说:

  

当数据为字典且未传递索引时,系列索引将按照字典的插入顺序进行排序

我从没有传递索引的字典中实例化了一个熊猫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

3 个答案:

答案 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.reindexordered 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列将按字典的插入顺序排序。

这意味着,如果要确保列和索引都排序,则可能需要传递索引或稍后对其进行排序。

希望它能回答您的问题。