2017-08-07 80 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]]