2017-01-28 62 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)