Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧转换为NumPy数组_Python_Arrays_Pandas_Numpy_Dataframe - Fatal编程技术网

Python 将数据帧转换为NumPy数组

Python 将数据帧转换为NumPy数组,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,我很想知道如何将pandas数据帧转换为NumPy数组 数据帧: 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]

我很想知道如何将pandas数据帧转换为NumPy数组

数据帧:

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')
给予

我想将其转换为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]])
我该怎么做


作为奖励,可以像这样保存数据类型吗

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')])
数组([[1,nan,0.2,nan],
[2,楠,楠,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,楠,楠]],

dtype=[('ID','您可以使用
to_records
方法,但如果数据类型不是您想要的,则必须对其进行一些处理。在我的例子中,从字符串复制DF后,索引类型是string(在pandas中由
对象
dtype表示):

[102]中的
:df
出[102]:
标签A B C
身份证件
1 NaN 0.2 NaN
2楠楠0.5
3.0.20.5
40.10.2南
5      0.1  0.2  0.5
6 0.1 NaN 0.5
7 0.1楠楠
在[103]中:df.index.dtype
Out[103]:数据类型(“对象”)
In[104]:df.to_记录()
Out[104]:
记录数组([(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','我只需将and函数链接起来,以获得数据帧的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]])
要获取数据类型,我们需要使用以下命令将此数据数组转换为结构化数组:

[10]中的
:df.reset_index().values.ravel().view(数据类型=[('index',int),('A',float),('B',float),('C',float)])
出[10]:
数组([(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','注意:此答案中使用的
.as_matrix()
方法已被弃用。0.23.4警告:

方法
.as_matrix
将在将来的版本中删除。请改用.values


熊猫有内在的东西

numpy_matrix = df.as_matrix()
给予


下面是我从数据帧生成结构数组的方法

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
创建数据帧

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
定义从数据帧生成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
使用
reset_index
创建一个新的数据框,其中包含索引作为其数据的一部分。将该数据框转换为结构数组

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')])
sa=df\u to\u sarray(df.reset\u index())
sa
数组([(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','在meteore的回答之后,我找到了代码

df.index = df.index.astype('i8')
不适合我。所以我把我的代码放在这里是为了方便其他遇到这个问题的人

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

要将熊猫数据帧(df)转换为numpy数据阵列,请使用以下代码:

df.values

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

只是在从dataframe导出到arcgis表时遇到了类似的问题,并且偶然发现了usgs()的解决方案。 简而言之,您的问题有一个类似的解决方案:

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

np_data = np.array(np.rec.fromrecords(df.values))
np_names = df.dtypes.index.tolist()
np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])

np_data

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)], 
      dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))
df
A、B、C
身份证件
1 NaN 0.2 NaN
2楠楠0.5
3.0.20.5
40.10.2南
5   0.1  0.2  0.5
6 0.1 NaN 0.5
7 0.1楠楠
np_data=np.array(np.rec.fromrecords(df.values))
np_names=df.dtypes.index.tolist()
np_data.dtype.names=元组([name.encode('UTF8')表示np_名称中的名称])
np_数据
数组([(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,楠,楠)],

dtype=(numpy.record,[('A','将数据帧转换为其numpy数组表示形式的两种方法

  • mah\u np\u数组=df.as\u矩阵(列=None)

  • mah\u np\u数组=df.值


Doc:

看起来
df.to_records()
对您有效。您正在查找的确切功能和
to_records
作为替代

我使用您的示例在本地进行了尝试,该调用产生的结果与您所寻找的输出非常相似:

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=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])
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=[(u'ID','一种更简单的方法,例如数据帧:

df

         gbm       nnet        reg
0  12.097439  12.047437  12.100953
1  12.109811  12.070209  12.095288
2  11.720734  11.622139  11.740523
3  11.824557  11.926414  11.926527
4  11.800868  11.727730  11.729737
5  12.490984  12.502440  12.530894
使用:

获取:

数组([[(0,12.097439,12.047437,12.10095324),
(1, 12.10981081, 12.070209, 12.09528824),
(2, 11.72073428, 11.622139, 11.74052253),
(3, 11.82455653, 11.926414, 11.92652727),
(4, 11.80086775, 11.72773 , 11.72973699),
(5, 12.49098389, 12.50244 , 12.53089367)]],
dtype=(numpy.record,[('index','
df.to_numpy()
优于
df.values
,原因如下* 是时候反对使用
作为矩阵()

pandas
v0.24.0
引入了两种从pandas对象获取NumPy阵列的新方法:

  • 到_numpy()
    ,在
    索引
    系列
    数据帧
    对象上定义,以及
  • 数组
    ,仅在
    索引
    系列
    对象上定义
  • 如果访问v0.24文档,您将看到一个大的红色警告,上面写着:

    警告:建议改用
    DataFrame.to\u numpy()
    。 有关详细信息,请参见和

    *-
    to_numpy()
    是我推荐的方法,适用于任何需要在将来的许多版本中可靠运行的生产代码。但是,如果您只是做了一个scratchpa
    df.values
    
    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]])
    
    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
    
    np_data = np.array(np.rec.fromrecords(df.values))
    np_names = df.dtypes.index.tolist()
    np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])
    
    np_data
    
    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)], 
          dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))
    
    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=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])
    
    df
    
             gbm       nnet        reg
    0  12.097439  12.047437  12.100953
    1  12.109811  12.070209  12.095288
    2  11.720734  11.622139  11.740523
    3  11.824557  11.926414  11.926527
    4  11.800868  11.727730  11.729737
    5  12.490984  12.502440  12.530894
    
    np.array(df.to_records().view(type=np.matrix))
    
    array([[(0, 12.097439  , 12.047437, 12.10095324),
            (1, 12.10981081, 12.070209, 12.09528824),
            (2, 11.72073428, 11.622139, 11.74052253),
            (3, 11.82455653, 11.926414, 11.92652727),
            (4, 11.80086775, 11.72773 , 11.72973699),
            (5, 12.49098389, 12.50244 , 12.53089367)]],
    dtype=(numpy.record, [('index', '<i8'), ('gbm', '<f8'), ('nnet', '<f4'),
           ('reg', '<f8')]))
    
    # Setup
    df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, 
                      index=['a', 'b', 'c'])
    
    # Convert the entire DataFrame
    df.to_numpy()
    # array([[1, 4, 7],
    #        [2, 5, 8],
    #        [3, 6, 9]])
    
    # Convert specific columns
    df[['A', 'C']].to_numpy()
    # array([[1, 7],
    #        [2, 8],
    #        [3, 9]])
    
    df.index.to_numpy()
    # array(['a', 'b', 'c'], dtype=object)
    
    df['A'].to_numpy()
    #  array([1, 2, 3])
    
    v = df.to_numpy()
    v[0, 0] = -1
     
    df
       A  B  C
    a -1  4  7
    b  2  5  8
    c  3  6  9
    
    a = pd.array([1, 2, None], dtype="Int64")                                  
    a                                                                          
    
    <IntegerArray>
    [1, 2, <NA>]
    Length: 3, dtype: Int64 
    
    # Wrong
    a.to_numpy()                                                               
    # array([1, 2, <NA>], dtype=object)  # yuck, objects
    
    # Correct
    a.to_numpy(dtype='float', na_value=np.nan)                                 
    # array([ 1.,  2., nan])
    
    # Also correct
    a.to_numpy(dtype='int', na_value=-1)
    # array([ 1,  2, -1])
    
    df.to_records()
    # rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
    #           dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
    
    v = df.reset_index()
    np.rec.fromrecords(v, names=v.columns.tolist())
    # rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
    #           dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
    
    df2 = pd.concat([df] * 10000)
    
    %timeit df2.to_records()
    %%timeit
    v = df2.reset_index()
    np.rec.fromrecords(v, names=v.columns.tolist())
    
    12.9 ms ± 511 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    9.56 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    a = numpy.asarray(df)
    
    import pandas as pd
    df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
    df_to_array = df.to_numpy()
    array([[1, 3],
       [2, 4]])
    
    np.array(df) 
    
    array([['ID', nan, nan, nan],
       ['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=object)