当前位置: 首页 > 知识库问答 >
问题:

如何将列和行的熊猫数据帧子集转换为 numpy 数组?

仲元凯
2023-03-14

我想知道是否有一种更简单、内存高效的方法来从熊猫数据帧中选择行和列的子集。

例如,给定此数据帧:

df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
print df

          a         b         c         d         e
0  0.945686  0.000710  0.909158  0.892892  0.326670
1  0.919359  0.667057  0.462478  0.008204  0.473096
2  0.976163  0.621712  0.208423  0.980471  0.048334
3  0.459039  0.788318  0.309892  0.100539  0.753992

我只想要那些列c的值大于0.5的行,但是我只需要那些行的列b和e。

这就是我想出的方法——也许有更好的“熊猫”方法?

locs = [df.columns.get_loc(_) for _ in ['a', 'd']]
print df[df.c > 0.5][locs]

          a         d
0  0.945686  0.892892

我的最终目标是将结果转换为numpy数组,并传递到sklearn回归算法中,因此我将使用上面的代码,如下所示:

training_set = array(df[df.c > 0.5][locs])

…这让我很恼火,因为我最终在内存中获得了一个巨大的数组副本。也许还有更好的方法?

共有3个答案

程禄
2023-03-14

.loc 同时接受行和列选择器(.ix/.iloc 仅供参考)这也是一次性完成的。

In [1]: df = DataFrame(np.random.rand(4,5), columns = list('abcde'))

In [2]: df
Out[2]: 
          a         b         c         d         e
0  0.669701  0.780497  0.955690  0.451573  0.232194
1  0.952762  0.585579  0.890801  0.643251  0.556220
2  0.900713  0.790938  0.952628  0.505775  0.582365
3  0.994205  0.330560  0.286694  0.125061  0.575153

In [5]: df.loc[df['c']>0.5,['a','d']]
Out[5]: 
          a         d
0  0.669701  0.451573
1  0.952762  0.643251
2  0.900713  0.505775

如果你想要这些值(尽管这应该直接传递给 sklearn);帧支持阵列接口

In [6]: df.loc[df['c']>0.5,['a','d']].values
Out[6]: 
array([[ 0.66970138,  0.45157274],
       [ 0.95276167,  0.64325143],
       [ 0.90071271,  0.50577509]])
祁权
2023-03-14

也许对于第一个问题,您可以简单地按列的名称访问列:

>>> df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
>>> df[df['c']>.5][['b','e']]
          b         e
1  0.071146  0.132145
2  0.495152  0.420219

对于第二个问题:

>>> df[df['c']>.5][['b','e']].values
array([[ 0.07114556,  0.13214495],
       [ 0.49515157,  0.42021946]])
墨寂弦
2023-03-14

直接使用其值:

In [79]: df[df.c > 0.5][['b', 'e']].values
Out[79]: 
array([[ 0.98836259,  0.82403141],
       [ 0.337358  ,  0.02054435],
       [ 0.29271728,  0.37813099],
       [ 0.70033513,  0.69919695]])
 类似资料:
  • 如何将pandas数据帧(21 x 31)转换为numpy数组? 例如: 数组_1(n_1,n_2,n_3,…,n31) 数组_2(n_1,n_2,n_3,…,n31) 数组21(n_1,n_2,n_3,…,n31) 我尝试了以下代码段: .. 并得到如下结果: 问题是第二个方括号太多了。我该如何解决这个问题?

  • 我对熊猫有些陌生。我有一个熊猫数据框,是一行23列。 我想把它转换成一个系列?我想知道做这件事最像蟒蛇的方式是什么? 我试过pd。系列(我的结果),但它抱怨。它还没有聪明到意识到它仍然是数学术语中的“向量”。 谢谢!

  • 我使用熊猫数据框来清理和处理数据。但是,我需要将其转换为numpy ndarray,以便使用利用矩阵乘法。我将数据框转换为具有以下内容的列表列表: 这将返回以下结构: 然后我将其转换为如下所示的numpy数组: 然而,以下打印: 给出这个结果: 但是,我需要它们都是numpy数组。如果它不是来自熊猫数据帧,我只是转换一个硬编码列表,那么它们都是Ndarray。当列表是从数据帧生成的时,如何获取该列

  • 我有一个需要一个数据帧作为输入的计算。我想对存储在扩展到51GB的netCDF文件中的数据运行此计算-目前,我一直在使用打开文件,并使用块(我的理解是,此打开的文件实际上是一个dask数组,因此一次只能将数据块加载到内存中)。但是,我似乎无法利用这种延迟加载,因为我必须将xarray数据转换为pandas数据帧才能运行我的计算——我的理解是,在这一点上,所有数据都加载到内存中(这是不好的)。 所以

  • 我有一个这样的字典列表: 我想把它变成一个熊猫,如下所示: 注意:列的顺序并不重要。 如何将字典列表转换为如上所示的数据帧?

  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是: