2017-08-07 79 views
6

我有一个数据帧中,我想将“生” numpy.array的细胞:商店numpy.array在Pandas.DataFrame

df['COL_ARRAY'] = df.apply(lambda r: np.array(do_something_with_r), axis=1) 

但似乎pandas试图“解包”的numpy的。阵列。

是否有解决方法?除了使用包装(请参阅下面的编辑)?我试过reduce=False没有成功。

编辑

这工作,但我必须使用“假” Data类来包装的阵列,这是不能令人满意,不是很优雅左右。

class Data: 
    def __init__(self, v): 
     self.v = v 

meas = pd.read_excel(DATA_FILE) 
meas['DATA'] = meas.apply(
    lambda r: Data(np.array(pd.read_csv(r['filename'])))), 
    axis=1 
) 

回答

9

使用numpy的阵列周围的包装即numpy的数组传递作为列表

a = np.array([5,6,7,8]) 
df = pd.DataFrame({"a":[a]}) 

输出:

 
      a 
0 [5, 6, 7, 8] 

或者您也可以通过创建的元组也就是说,如果你有使用apply(np.array)一个数据帧

df = pd.DataFrame({'id':[1,2,3,4],'a':['on','on','off','off'], 'b':['on','off','on','off']}) 

df['new'] = df.apply(lambda r: tuple(r),axis=1).apply(np.array) 

输出:

 
    a b id   new 
0 on on 1 [on, on, 1] 
1 on off 2 [on, off, 2] 
2 off on 3 [off, on, 3] 
3 off off 4 [off, off, 4] 
df['new'][0] 

输出:

array(['on', 'on', '1'], dtype='<U2') 
+0

这一工程,但是我宁愿使用虚拟类而不是列表。 –

+0

我的更新答案哦? – Dark

+0

如果不是'tuple(r)'你做了类似'np.array([[1,2],[3,4]])'的事情,那么它会起作用吗?一个2-dim阵列? –

1

你可以用方括号中的数据帧的数据参数传递给保持在每个单元的np.array

one_d_array = np.array([1,2,3]) 
two_d_array = one_d_array*one_d_array[:,np.newaxis] 
two_d_array 

array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 


pd.DataFrame([ 
    [one_d_array], 
    [two_d_array] ]) 

            0 
0       [1, 2, 3] 
1 [[1, 2, 3], [2, 4, 6], [3, 6, 9]]