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

时间:2016-04-11 03:32:59

标签: python pandas

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

例如,我有两个numpy数组,我想将它们合并为Pandas数据框。

foo = np.array( [ 1, 2, 3 ] )
bar = np.array( [ 4, 5, 6 ] )

如果我执行此操作,bar列将首先显示,因为dict不会保留顺序。

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

    bar foo
0   4   1
1   5   2
2   6   3

我可以做到这一点,但当我需要组合许多变量时,它会变得乏味。

pd.DataFrame( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) }, columns = [ 'foo', 'bar' ] )

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

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

7 个答案:

答案 0 :(得分:20)

创建columns时使用DataFrame关键字:

pd.DataFrame({'foo': foo, 'bar': bar}, columns=['foo', 'bar'])

另请注意,您不需要创建系列。

答案 1 :(得分: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

<强>更新

来自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])))

从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])))

或简单地说:

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

答案 2 :(得分:0)

这可能是另一种接近它的方法:

foo = np.array( [ 1, 2, 3 ] )
bar = np.array( [ 4, 5, 6 ] )
stacked = np.vstack((x,y)).T
stacked
array([[1, 4],
       [2, 5],
       [3, 6]])

new_df = pd.DataFrame(stacked, columns = ['foo', 'bar'] )
new_df
   foo  bar
0   1   4
1   2   5
2   3   6

答案 3 :(得分:0)

使数据框仅包含其中的数据,然后转置它。

然后添加列。

>>> foo = np.array( [ 1, 2, 3 ] )
>>> bar = np.array( [ 4, 5, 6 ] )
>>>     
>>> df = pd.DataFrame([foo, bar]).T
>>> df.columns = ['foo','bar']
>>> df
  foo bar
0  1   4
1  2   5
2  3   6

答案 4 :(得分:0)

另一个粗略的解决方案可能是将X_传递给列的标题,其中X是列的顺序编号:

{{1}}

之后,您可以使用列或其他内容重新重命名列! 世界上较少的pythonic代码!!!

祝你好运伙伴们!

答案 5 :(得分:0)

我所做的如下:

# Creating list of dict
list_of_dicts = ({'key1':'valueA', 'key2':'valueB},{'key1':'valueC', 'key2':'valueD}')

#getting list of keys from the dict
keys_list = list(list_of_dicts.keys())

# and finally
df = pd.DataFrame(list_of_dicts, columns = keys_list)

为我完美地工作。

答案 6 :(得分:0)

这个问题很老,但是希望为“在将csv文件读入熊猫数据帧时保留列的顺序”这个问题提供我的解决方案:

import numpy as np
import pandas as pd

# Get column count as a list
cols = np.arange(0, hmprice.shape[1])
df = pd.read_csv('train.csv', usecols=cols)
df.head()

Default Order of dataframe:
Preserved order of dataframe:

注意:属性usecols可以采用列名称或列索引;但是pandas不遵守列名或列索引的“任何其他顺序”。

例如,

    df = pd.read_csv('train.csv', usecols=[1, 2, 3])<br/>
or
    df = pd.read_csv('train.csv', usecols=[3, 2, 1])<br/>

给出相同的结果。