Python 将数组的数据帧转换为矩阵

Python 将数组的数据帧转换为矩阵,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,我正在尝试将包含数组的pandas数据帧转换为矩阵,并正在寻找最好的方法。 假设我有这个数据帧,我想切掉两行,这两行应该得到一个2x2大小的矩阵 import pandas as pd import numpy as np df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]}) df['a'] = df['a'].map(np.array) 以下模式生成一个对象的numpy数组,从而生成一个大小为2的数组: df.loc[0:1,'a'].to_nump

我正在尝试将包含数组的pandas数据帧转换为矩阵,并正在寻找最好的方法。 假设我有这个数据帧,我想切掉两行,这两行应该得到一个2x2大小的矩阵

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]})
df['a'] = df['a'].map(np.array)
以下模式生成一个对象的numpy数组,从而生成一个大小为2的数组:

df.loc[0:1,'a'].to_numpy().shape   # (2,)
df.loc[0:1,'a'].values.shape       # (2,)
np.array(df.loc[0:1,'a'].values).shape   # (2,)
np.array(df.loc[0:1,'a']).shape    # (2,)
这是我找到的最接近的解决方案,但它增加了一个额外的维度,我不明白为什么这是有效的,但上面的那些没有

np.array([df.loc[0:1,'a']]).shape  #( 1,2,2)
是否有一种解决方案可以直接将其转换为形状[2,2],而无需循环或删除额外维度?

这似乎可以生成所需的(2,2)数组。我还添加了一个带有两列的df2,可以根据您的评论将其重塑为2x2数组。但我的解决方案感觉像是一个黑客。我相信这是可以改进的

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]})
df['a'] = df['a'].map(np.array)
np.concatenate(df.loc[0:1,'a'],axis = 0).reshape(2,-1).shape

df2 = pd.DataFrame({'a':[[1,2], [3,4], [5,6]],'b':[[1,2], [3,4], [5,6]] })
np.array(df2.loc[0:1,'a':'b'].applymap(np.array)
         .apply(np.concatenate, axis = 0)).reshape(2,2,-1).shape
这似乎会生成所需的(2,2)数组。我还添加了一个带有两列的df2,可以根据您的评论将其重塑为2x2数组。但我的解决方案感觉像是一个黑客。我相信这是可以改进的

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]})
df['a'] = df['a'].map(np.array)
np.concatenate(df.loc[0:1,'a'],axis = 0).reshape(2,-1).shape

df2 = pd.DataFrame({'a':[[1,2], [3,4], [5,6]],'b':[[1,2], [3,4], [5,6]] })
np.array(df2.loc[0:1,'a':'b'].applymap(np.array)
         .apply(np.concatenate, axis = 0)).reshape(2,2,-1).shape

将值转换为嵌套列表,然后转换为
数组

a = np.array(df.loc[0:1,'a'].tolist())
print (a)
[[1 2]
 [3 4]]

print (a.shape)
(2, 2)


将值转换为嵌套列表,然后转换为
数组

a = np.array(df.loc[0:1,'a'].tolist())
print (a)
[[1 2]
 [3 4]]

print (a.shape)
(2, 2)


我对@jezrael发布的答案做了一些修改 我希望这对你有用

假设您的数据帧是这样的


数据帧({'a':[[1,2],[3,4],[5,6]],'b':[[11,2],[6,9],[5,6]})

对两列都执行此操作


a=np.array(df.loc[0:1,'a'].tolist())
b=np.array(df.loc[0:1,'b'].tolist())

然后连接两个数组


np.连接((a,b),轴=1)。重塑(-1,2,2)。形状

我对@jezrael发布的答案做了一些修改 我希望这对你有用

假设您的数据帧是这样的


数据帧({'a':[[1,2],[3,4],[5,6]],'b':[[11,2],[6,9],[5,6]})

对两列都执行此操作


a=np.array(df.loc[0:1,'a'].tolist())
b=np.array(df.loc[0:1,'b'].tolist())

然后连接两个数组


np.连接((a,b),轴=1)。重塑(-1,2,2)。形状

np.array([df.loc[0:1,'a']])与上面的尝试相比,您为什么在array()函数中添加[],而在其他尝试中为什么不添加[]?我尝试了不同的方法,添加[]似乎有效。但这增加了一个我不想要的额外维度。这就是为什么与上面的尝试相比,我没有更多关于typenp.array([df.loc[0:1,'a']])的示例,为什么在array()函数中添加了[],为什么在其他尝试中没有添加[]?我尝试了不同的方法,通过添加[],它似乎可以工作。但这增加了一个我不想要的额外维度。这就是为什么我没有更多这种类型的例子谢谢,这个解决方案很有效,但也许我的例子太简单了。当添加两列和两行时,你应该得到一个大小为2x2x2的矩阵,然后这个解决方案似乎不再有效。@Dangraf你能为这个“df=pd.DataFrame({'a':[[1,2],[3,4],[5,6]})df['a']=df['a']=map(np.array)df['b']=df['a]cols=['a','b']df.loc[0:1,['a','b'],[b']]到.](2x2x2)np.数组([df.loc[0:1,cols]])。形状#(1,2)“``我修改了我的代码,将带有两列select的df2更改为2x2x2数组。你可以用它作为指南来获得你真正想要的。可能很难得到一个适用于任何n-d数组的完全通用的解决方案。谢谢,这个解决方案很有效,但可能我的示例太简单了。当添加例如两列两行时,你应该如果你得到一个大小为2x2x2的矩阵,那么这个解决方案似乎就不起作用了。@Dangraf你能为这个“df=pd.DataFrame({'a':[[1,2],[3,4],[5,6]})df['a']=df['a']=df['a]cols=['a','b']df.loc[0:1,['a','b']]df.loc.to#(2,2),预期的(np.col.2x2)数组('b']=df.loc#(1,2)``我修改了我的代码,将带有两列select的df2更改为2x2x2数组。您可以使用它作为指南来获得您真正想要的。可能很难获得一个适用于任何n-d数组的完全通用的解决方案。我仍然从您的示例中获得形状(2)above@Dangraf-很有趣,我得到了
(2,2)
@jezrael我想知道更多关于你使用
tolist()
而不是
np的直觉。重塑
@ShubhamShaswat-好吧,如果你认为这是一个糟糕的解决方案,请随意解释。@jezrael嘿,你有迄今为止最好的解决方案,我只是想知道你是怎么想到这个的。我的意思是没有不尊重,就像learnI一样,我仍然保持身材(2,)以你为例above@Dangraf-这很有趣,我得到了
(2,2)
@jezrael我想知道更多关于你使用
tolist()背后的直觉
而不是
np.重塑
@ShubhamShaswat-好吧,如果你认为这是一个糟糕的解决方案,请随意解释。@jezrael嘿,你有迄今为止最好的解决方案,我只是想知道你是怎么想到这个的。我的意思不是不尊重,就像学习一样