从Numpy数组创建Pandas DataFrame:如何指定索引列和列标题?


281

我有一个由列表列表组成的Numpy数组,代表带有行标签和列名的二维数组,如下所示:

data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]])

我希望所得的DataFrame将Row1和Row2作为索引值,并将Col1,Col2作为标头值

我可以指定索引如下:

df = pd.DataFrame(data,index=data[:,0]),

但是我不确定如何最好地分配列标题。


3
@ behzad.nouri的答案是正确的,但我认为您应该考虑是否不能使用其他形式的初始数据。因为现在,您的值将是字符串而不是整数(由于numpy数组将整数和字符串混合在一起,因此所有值都强制转换为字符串,因为numpy数组必须是同构的)。
joris

Answers:


315

您需要指定dataindexcolumnsDataFrame构造函数,如:

>>> pd.DataFrame(data=data[1:,1:],    # values
...              index=data[1:,0],    # 1st column as index
...              columns=data[0,1:])  # 1st row as the column names

编辑:如@joris注释中一样,您可能需要更改上述内容np.int_(data[1:,1:])才能具有正确的数据类型。


7
这行得通-但是对于输入数据的这种通用结构和所需的应用,DataFrame是否没有“捷径”?基本上,这是csvs加载的方式-可以通过许多csv阅读器的默认处理方式进行管理 。df的类似结构将很有用。
javadba

我为此添加了一个迷你帮助程序/便利方法,作为补充答案。
javadba

93

这是一个易于理解的解决方案

import numpy as np
import pandas as pd

# Creating a 2 dimensional numpy array
>>> data = np.array([[5.8, 2.8], [6.0, 2.2]])
>>> print(data)
>>> data
array([[5.8, 2.8],
       [6. , 2.2]])

# Creating pandas dataframe from numpy array
>>> dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})
>>> print(dataset)
   Column1  Column2
0      5.8      2.8
1      6.0      2.2

20
但是,您必须手动指定Series不可扩展的名称..。
javadba

24

我同意Joris;似乎您应该以不同的方式执行此操作,例如使用numpy record arrays。从这个好答案中修改“选项2” ,您可以像这样进行操作:

import pandas
import numpy

dtype = [('Col1','int32'), ('Col2','float32'), ('Col3','float32')]
values = numpy.zeros(20, dtype=dtype)
index = ['Row'+str(i) for i in range(1, len(values)+1)]

df = pandas.DataFrame(values, index=index)

13

只需使用pandas DataFrame的from_records即可完成此操作

import numpy as np
import pandas as pd
# Creating a numpy array
x = np.arange(1,10,1).reshape(-1,1)
dataframe = pd.DataFrame.from_records(x)

此答案不适用于问题中提供的示例数据,即data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]])
jpp

没有指定标签时最简单的一般解决方案。
cerebrou

12
    >>import pandas as pd
    >>import numpy as np
    >>data.shape
    (480,193)
    >>type(data)
    numpy.ndarray
    >>df=pd.DataFrame(data=data[0:,0:],
    ...        index=[i for i in range(data.shape[0])],
    ...        columns=['f'+str(i) for i in range(data.shape[1])])
    >>df.head()
    [![array to dataframe][1]][1]

在此处输入图片说明


8

添加到@ behzad.nouri的答案-我们可以创建一个帮助程序来处理这种常见情况:

def csvDf(dat,**kwargs): 
  from numpy import array
  data = array(dat)
  if data is None or len(data)==0 or len(data[0])==0:
    return None
  else:
    return pd.DataFrame(data[1:,1:],index=data[1:,0],columns=data[0,1:],**kwargs)

让我们尝试一下:

data = [['','a','b','c'],['row1','row1cola','row1colb','row1colc'],
     ['row2','row2cola','row2colb','row2colc'],['row3','row3cola','row3colb','row3colc']]
csvDf(data)

In [61]: csvDf(data)
Out[61]:
             a         b         c
row1  row1cola  row1colb  row1colc
row2  row2cola  row2colb  row2colc
row3  row3cola  row3colb  row3colc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.