2017-01-28 5 views
2

Мне нужно создать dataframe, содержащий кортежи из серии массивов dataframes. Что мне нужно следующее:Создайте фрейм данных pandas с каждым элементом кортеж, созданный из других фреймов данных

У меня есть dataframes a и b:

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 

Я хочу создать dataframe a_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) 

 Смежные вопросы

  • Нет связанных вопросов^_^