本文翻译自:
    
     Convert pandas dataframe to NumPy array
    
   
    
     I am interested in knowing how to convert a pandas dataframe into a NumPy array.
    
    
     我对知道如何将熊猫数据框转换为NumPy数组感兴趣。
    
   
    
     dataframe:
    
    
     数据框:
    
   
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
    
     gives
    
    
     给
    
   
label   A    B    C
ID                                 
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN
    
     I would like to convert this to a NumPy array, as so:
    
    
     我想将其转换为NumPy数组,如下所示:
    
   
array([[ nan,  0.2,  nan],
       [ nan,  nan,  0.5],
       [ nan,  0.2,  0.5],
       [ 0.1,  0.2,  nan],
       [ 0.1,  0.2,  0.5],
       [ 0.1,  nan,  0.5],
       [ 0.1,  nan,  nan]])
    
     How can I do this?
    
    
     我怎样才能做到这一点?
    
   
    
     As a bonus, is it possible to preserve the dtypes, like this?
    
    
     另外,是否可以像这样保留dtype?
    
   
array([[ 1, nan,  0.2,  nan],
       [ 2, nan,  nan,  0.5],
       [ 3, nan,  0.2,  0.5],
       [ 4, 0.1,  0.2,  nan],
       [ 5, 0.1,  0.2,  0.5],
       [ 6, 0.1,  nan,  0.5],
       [ 7, 0.1,  nan,  nan]],
     dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
    
     or similar?
    
    
     或类似的?
    
   
    #1楼
   
    参考:
    
     https://stackoom.com/question/tKk6/将pandas数据框转换为NumPy数组
    
   
    #2楼
   
    
     You can use the
     
      to_records
     
     method, but have to play around a bit with the dtypes if they are not what you want from the get go.
    
    
     您可以使用
     
      to_records
     
     方法,但是如果dtype不是您一开始就不想要的类型,则必须对其进行一些操作。
    
    
     In my case, having copied your DF from a string, the index type is string (represented by an
     
      object
     
     dtype in pandas):
    
    
     就我而言,从字符串复制了DF,索引类型为字符串(由pandas中的dtype
     
      object
     
     表示):
    
   
In [102]: df
Out[102]: 
label    A    B    C
ID                  
1      NaN  0.2  NaN
2      NaN  NaN  0.5
3      NaN  0.2  0.5
4      0.1  0.2  NaN
5      0.1  0.2  0.5
6      0.1  NaN  0.5
7      0.1  NaN  NaN
In [103]: df.index.dtype
Out[103]: dtype('object')
In [104]: df.to_records()
Out[104]: 
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [106]: df.to_records().dtype
Out[106]: dtype([('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
    
     Converting the recarray dtype does not work for me, but one can do this in Pandas already:
    
    
     转换recarray dtype对我不起作用,但是已经可以在Pandas中做到这一点:
    
   
In [109]: df.index = df.index.astype('i8')
In [111]: df.to_records().view([('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
Out[111]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
       (4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
       (7, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
    
     Note that Pandas does not set the name of the index properly (to
     
      ID
     
     ) in the exported record array (a bug?), so we profit from the type conversion to also correct for that.
    
    
     请注意,Pandas在导出的记录数组中没有正确设置索引名称(至
     
      ID
     
     )(错误?),因此我们可以从类型转换中受益,也可以对此进行更正。
    
   
    
     At the moment Pandas has only 8-byte integers,
     
      i8
     
     , and floats,
     
      f8
     
     (see this
     
      issue
     
     ).
    
    
     目前,Pandas只有8个字节的整数
     
      i8
     
     和浮点数
     
      f8
     
     (请参阅此
     
      问题
     
     )。
    
   
    #3楼
   
    
     I would just chain the
     
      DataFrame.reset_index()
     
     and
     
      DataFrame.values
     
     functions to get the Numpy representation of the dataframe, including the index:
    
    
     我只需要链接
     
      DataFrame.reset_index()
     
     和
     
      DataFrame.values
     
     函数来获得数据帧的Numpy表示,包括索引:
    
   
In [8]: df
Out[8]: 
          A         B         C
0 -0.982726  0.150726  0.691625
1  0.617297 -0.471879  0.505547
2  0.417123 -1.356803 -1.013499
3 -0.166363 -0.957758  1.178659
4 -0.164103  0.074516 -0.674325
5 -0.340169 -0.293698  1.231791
6 -1.062825  0.556273  1.508058
7  0.959610  0.247539  0.091333
[8 rows x 3 columns]
In [9]: df.reset_index().values
Out[9]:
array([[ 0.        , -0.98272574,  0.150726  ,  0.69162512],
       [ 1.        ,  0.61729734, -0.47187926,  0.50554728],
       [ 2.        ,  0.4171228 , -1.35680324, -1.01349922],
       [ 3.        , -0.16636303, -0.95775849,  1.17865945],
       [ 4.        , -0.16410334,  0.0745164 , -0.67432474],
       [ 5.        , -0.34016865, -0.29369841,  1.23179064],
       [ 6.        , -1.06282542,  0.55627285,  1.50805754],
       [ 7.        ,  0.95961001,  0.24753911,  0.09133339]])
    
     To get the dtypes we’d need to transform this ndarray into a structured array using
     
      view
     
     :
    
    
     为了获得dtypes,我们需要使用
     
      view
     
     将此ndarray转换为结构化数组:
    
   
In [10]: df.reset_index().values.ravel().view(dtype=[('index', int), ('A', float), ('B', float), ('C', float)])
Out[10]:
array([( 0, -0.98272574,  0.150726  ,  0.69162512),
       ( 1,  0.61729734, -0.47187926,  0.50554728),
       ( 2,  0.4171228 , -1.35680324, -1.01349922),
       ( 3, -0.16636303, -0.95775849,  1.17865945),
       ( 4, -0.16410334,  0.0745164 , -0.67432474),
       ( 5, -0.34016865, -0.29369841,  1.23179064),
       ( 6, -1.06282542,  0.55627285,  1.50805754),
       ( 7,  0.95961001,  0.24753911,  0.09133339),
       dtype=[('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
    #4楼
   
    
     
      
       Note
      
     
     
      : The
      
       .as_matrix()
      
      method used in this answer is deprecated.
     
    
    
     
      
       注意
      
     
     
      :不
      
       .as_matrix()
      
      使用此答案中的
      
       .as_matrix()
      
      方法。
     
    
    
     
      Pandas 0.23.4 warns:
     
    
    
     
      熊猫0.23.4警告:
     
    
   
Method
.as_matrix
will be removed in a future version.
方法
.as_matrix
将在以后的版本中删除。
Use .values instead.
请改用.values。
    
     Pandas has something built in…
    
    
     熊猫内置一些东西…
    
   
numpy_matrix = df.as_matrix()
    
     gives
    
    
     给
    
   
array([[nan, 0.2, nan],
       [nan, nan, 0.5],
       [nan, 0.2, 0.5],
       [0.1, 0.2, nan],
       [0.1, 0.2, 0.5],
       [0.1, nan, 0.5],
       [0.1, nan, nan]])
    #5楼
   
    
     Here is my approach to making a structure array from a pandas DataFrame.
    
    
     这是我从pandas DataFrame制作结构数组的方法。
    
   
    
     Create the data frame
    
    
     创建数据框
    
   
import pandas as pd
import numpy as np
import six
NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)
      A    B    C
ID               
1   NaN  0.2  NaN
2   NaN  NaN  0.5
3   NaN  0.2  0.5
4   0.1  0.2  NaN
5   0.1  0.2  0.5
6   0.1  NaN  0.5
7   0.1  NaN  NaN
    
     Define function to make a numpy structure array (not a record array) from a pandas DataFrame.
    
    
     定义函数以从pandas DataFrame中创建一个numpy结构数组(而不是记录数组)。
    
   
def df_to_sarray(df):
    """
    Convert a pandas DataFrame object to a numpy structured array.
    This is functionally equivalent to but more efficient than
    np.array(df.to_array())
    :param df: the data frame to convert
    :return: a numpy structured array representation of df
    """
    v = df.values
    cols = df.columns
    if six.PY2:  # python 2 needs .encode() but 3 does not
        types = [(cols[i].encode(), df[k].dtype.type) for (i, k) in enumerate(cols)]
    else:
        types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)]
    dtype = np.dtype(types)
    z = np.zeros(v.shape[0], dtype)
    for (i, k) in enumerate(z.dtype.names):
        z[k] = v[:, i]
    return z
    
     Use
     
      reset_index
     
     to make a new data frame that includes the index as part of its data.
    
    
     使用
     
      reset_index
     
     可以创建一个新数据框,其中将索引作为其数据的一部分。
    
    
     Convert that data frame to a structure array.
    
    
     将该数据帧转换为结构数组。
    
   
sa = df_to_sarray(df.reset_index())
sa
array([(1L, nan, 0.2, nan), (2L, nan, nan, 0.5), (3L, nan, 0.2, 0.5),
       (4L, 0.1, 0.2, nan), (5L, 0.1, 0.2, 0.5), (6L, 0.1, nan, 0.5),
       (7L, 0.1, nan, nan)], 
      dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
    
     EDIT: Updated df_to_sarray to avoid error calling .encode() with python 3. Thanks to
     
      Joseph Garvin
     
     and
     
      halcyon
     
     for their comment and solution.
    
    
     编辑:更新df_to_sarray以避免错误调用.encode()与Python 3.感谢
     
      约瑟夫·加尔文
     
     和
     
      宁静
     
     为他们的意见和解决方案。
    
   
    #6楼
   
    
     Further to meteore’s answer, I found the code
    
    
     除了陨石的答案,我找到了代码
    
   
df.index = df.index.astype('i8')
    
     doesn’t work for me.
    
    
     对我不起作用。
    
    
     So I put my code here for the convenience of others stuck with this issue.
    
    
     因此,我将代码放在这里,以方便陷入此问题的其他人。
    
   
city_cluster_df = pd.read_csv(text_filepath, encoding='utf-8')
# the field 'city_en' is a string, when converted to Numpy array, it will be an object
city_cluster_arr = city_cluster_df[['city_en','lat','lon','cluster','cluster_filtered']].to_records()
descr=city_cluster_arr.dtype.descr
# change the field 'city_en' to string type (the index for 'city_en' here is 1 because before the field is the row index of dataframe)
descr[1]=(descr[1][0], "S20")
newArr=city_cluster_arr.astype(np.dtype(descr))
 
