从dict和索引顺序创建DataFrame?

问题描述 投票:1回答:3

我正在使用最新的Anaconda下载Python 3.7.1和pandas 0.23.4

pandas doc说:

当数据是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
pandas dictionary python-3.7
3个回答
1
投票

这似乎是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.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
投票

使用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)),:]

0
投票

看起来pd.Series和pd.DataFrame有不同的方式来处理这种情况。

我有类似的python环境,结果可以在我的电脑中复制。此外,Jezrel的pd.Series案例可以在我的计算机中复制。

我检查了手册,发现两个结果都是按照文档进行的。

对于系列,键是索引当数据是dict,并且未传递索引时,如果您使用的是Python版本> = 3.6且Pandas版本> = 0.23,则系列索引将按dict的插入顺序排序。

对于数据框:键是列。如果未传递轴标签,则将根据常识规则从输入数据构造它们。

注意当数据是dict且未指定列时,如果使用的是Python版本> = 3.6且Pandas> = 0.23,则数据框架列将按dict的插入顺序排序。

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

希望它能回答你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.