2017-01-28 58 views
2

我需要創建一個數據框包含一系列數據框數組中的元組。我需要的是以下內容:創建熊貓數據框與每個元素從其他數據框創建的元組

我有dataframes ab

a = pd.DataFrame(np.array([[1, 2],[3, 4]]), columns=['one', 'two']) 
b = pd.DataFrame(np.array([[5, 6],[7, 8]]), columns=['one', 'two']) 

a: 
    one two 
0 1 2 
1 3 4 

b: 
    one two 
0 5 6 
1 7 8 

我想創建一個數據幀a_b,其中每個元素是在從相應的元素形成的元組和b,即

a_b = pd.DataFrame([[(1, 5), (2, 6)],[(3, 7), (4, 8)]], columns=['one', 'two']) 

a_b: 
     one  two 
0 (1, 5) (2, 6) 
1 (3, 7) (4, 8) 

理想情況下,我想用任意數量的數據幀做到這一點。 我一直希望有一個更優雅的方式比使用的循環 我使用python 3

回答

1

您可以使用numpy.rec.fromarrays((a.values, b.values)).tolist()

In [34]: pd.DataFrame(np.rec.fromarrays((a.values, b.values)).tolist(), 
         columns=a.columns, 
         index=a.index) 
Out[34]: 
     one  two 
0 (1, 5) (2, 6) 
1 (3, 7) (4, 8) 

混融三教DF的:

In [36]: pd.DataFrame(np.rec.fromarrays((a.values, b.values, a.values)).tolist(), 
         columns=a.columns, 
         index=a.index) 
Out[36]: 
     one  two 
0 (1, 5, 1) (2, 6, 2) 
1 (3, 7, 3) (4, 8, 4) 

更新:

假設你事先並不知道數據幀的數量,你會怎麼做 ?

In [60]: dfs = [a,b,a] 

In [62]: tuple_of_dfs = (x.values for x in dfs) 

In [63]: pd.DataFrame(np.rec.fromarrays(tuple_of_dfs).tolist(), columns=a.columns, index=a.index) 
Out[63]: 
     one  two 
0 (1, 5, 1) (2, 6, 2) 
1 (3, 7, 3) (4, 8, 4) 
+0

謝謝,這個偉大的工程,但假設你事先不知道dataframes的數量,你會怎麼做? – gionni

+0

@gionni,請參閱更新部分 – MaxU

+0

非常感謝!!!! ;) – gionni

0

你可以使用zip超過a列,b

In [31]: pd.DataFrame({x: zip(a[x], b[x]) for x in a.columns}) 
Out[31]: 
     one  two 
0 (1, 5) (2, 6) 
1 (3, 7) (4, 8)