如何在保留列顺序的同时,从多个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:还有一点。如果我想添加或删除其中一个要加入的变量,我只想在一个地方添加/删除。
答案 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/>
给出相同的结果。