如何在保留列的顺序的同时创建DataFrame?

cei*_*cat 40 python pandas

如何在保留列顺序的同时从多个numpy数组,Pandas系列或PandasDataFrame 创建DataFrame ?

例如,我有这两个numpy数组,我想将它们组合为一个PandasDataFrame.

foo = np.array( [ 1, 2, 3 ] )
bar = np.array( [ 4, 5, 6 ] )
Run Code Online (Sandbox Code Playgroud)

如果我这样做,bar列将首先出现,因为dict不保留顺序.

pd.DataFrame( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) } )

    bar foo
0   4   1
1   5   2
2   6   3
Run Code Online (Sandbox Code Playgroud)

我可以这样做,但是当我需要组合许多变量时,它会变得乏味.

pd.DataFrame( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) }, columns = [ 'foo', 'bar' ] )
Run Code Online (Sandbox Code Playgroud)

编辑:有没有办法指定要连接的变量并在一个操作中组织列顺序?也就是说,我不介意使用多行来完成整个操作,但我宁愿不必多次指定要连接的变量(因为我会更改代码很多,这很容易出错) .

EDIT2:还有一点.如果我想添加或删除其中一个要加入的变量,我只想在一个地方添加/删除.

Edd*_*oso 30

原始解决方案:使用不正确 collections.OrderedDict

在我原来的解决方案,我建议用OrderedDictcollections包Python的标准库.

>>> import numpy as np
>>> import pandas as pd
>>> from collections import OrderedDict
>>>
>>> foo = np.array( [ 1, 2, 3 ] )
>>> bar = np.array( [ 4, 5, 6 ] )
>>>
>>> pd.DataFrame( OrderedDict( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) } ) )

   foo  bar
0    1    4
1    2    5
2    3    6
Run Code Online (Sandbox Code Playgroud)

正确的解决方案:传递Key-Value元组对以保存订单

但是,如上所述,如果传递普通字典OrderedDict,则可能仍然不保留该顺序,因为在构造字典时该顺序是随机的.但是,解决方法是将键值元组对列表转换为a OrderedDict,如此SO帖子所示:

>>> import numpy as np
>>> import pandas as pd
>>> from collections import OrderedDict
>>>
>>> a = np.array( [ 1, 2, 3 ] )
>>> b = np.array( [ 4, 5, 6 ] )
>>> c = np.array( [ 7, 8, 9 ] )
>>>
>>> pd.DataFrame( OrderedDict( { 'a': pd.Series(a), 'b': pd.Series(b), 'c': pd.Series(c) } ) )

   a  c  b
0  1  7  4
1  2  8  5
2  3  9  6

>>> pd.DataFrame( OrderedDict( (('a', pd.Series(a)), ('b', pd.Series(b)), ('c', pd.Series(c))) ) )

   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9
Run Code Online (Sandbox Code Playgroud)


blo*_*ley 22

columns创建时使用关键字DataFrame:

pd.DataFrame({'foo': foo, 'bar': bar}, columns=['foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)

另请注意,您无需创建系列.

  • 我最喜欢这个解决方案. (2认同)

Vid*_*a G 14

要将numpy数组中的列顺序传递保存为元组列表,请执行以下操作DataFrame.from_items:

>>> df = pd.DataFrame.from_items([('foo', foo), ('bar', bar)])

   foo  bar
0    1    4
1    2    5
2    3    6
Run Code Online (Sandbox Code Playgroud)

更新

来自pandas 0.23 from_items已被弃用,将被删除.所以numpy使用传递数组from_dict.要使用,from_dict您需要将项目作为字典传递:

>>> from collections import OrderedDict as OrderedDict
>>> df = pd.DataFrame.from_dict(OrderedDict(zip(['foo', 'bar'], [foo, bar])))
Run Code Online (Sandbox Code Playgroud)

从python 3.7开始,你可以依赖于保存的插入顺序(参见https://mail.python.org/pipermail/python-dev/2017-December/151283.html),所以:

>>> df = pd.DataFrame.from_dict(dict(zip(['foo', 'bar'], [foo, bar])))
Run Code Online (Sandbox Code Playgroud)

或者干脆:

>>> df = pd.DataFrame(dict(zip(['foo', 'bar'], [foo, bar])))
Run Code Online (Sandbox Code Playgroud)


tfv*_*tfv 7

创建数据框后,您只需按使用方式重新排序列

df= df[['foo','bar']]
Run Code Online (Sandbox Code Playgroud)