2016-07-06 4 views
0

У меня есть таблица ниже взяты онлайн через pandas.read_htmlPivoting Dataframe с панд

 Column0 Column1  Column2  Column3 
0  Entry_1 0.685  Record_1  0.69-S$ 0.685 
1  Entry_2 0.036  Record_2  0.685 
2  Entry_3 05/Jul/2016 Record_3  0.72-S$ 0.4 
3  Entry_4 0.338  Record_4  178.8 mm 
4  Entry_5 0.41   Record_5  0.06 
5  Entry_6 122.48  Record_6  17.29% 
6  Entry_7 0.5   Record_7  0.58 as of 05/Jul/2016 

Как pviot/транспозиции эти данные таким образом, что Column 0 становится заголовки, и Column 1 становится значения. Аналогично для Column 2 и Column 3?

+0

Это 2 dataframes? Вы хотите объединить их, а затем перенести объединенный блок данных? –

+0

Нет. Это в 1 кадре данных. Это был код, который я получил, когда печатал вывод из 'pandas.read_html'. Я хочу создать столбцы «Столбцы 0» и «Столбцы 2» для значений в столбцах «Столбцы 1» и «Столбцы 3» –

ответ

1

Возможно, это самый простой способ решить эту проблему. Самый простой способ я мог бы придумать.

Column0  Column1  Column2  Column3 
0 Entry_1  0.685 Record_1 0.69-S$ 0.685 
1 Entry_2  0.036 Record_2 0.685 
2 Entry_3  05/Jul/2016  Record_3 0.72-S$ 0.4 
3 Entry_4  0.338 Record_4 178.8 mm 
4 Entry_5  0.41 Record_5 0.06 
5 Entry_6  122.48 Record_6 17.29% 
6 Entry_7  0.5  Record_7 0.58 as of 05/Jul/2016 

cols = df['Column0'].append(df['Column2']) 
vals = df['Column1'].append(df['Column3']) 

newdf = pd.DataFrame(vals).T 
newdf.columns = cols 
newdf 



Entry_1 Entry_2  Entry_3  Entry_4  Entry_5  Entry_6  Entry_7  Record_1 Record_2 Record_3 Record_4 Record_5 Record_6 Record_7 
0 0.685 0.036 05/Jul/2016  0.338 0.41 122.48 0.5  0.69-S$ 0.685 0.685 0.72-S$ 0.4  178.8 mm 0.06 17.29% 0.58 as of 05/Jul/2016 
+0

Спасибо, Джо. Это работает :) –

0

я предлагаю вам использовать метод DataFrame.pivot, как в следующем примере:

import pandas as pd 
import numpy as np 
import pandas.util.testing as tm; tm.N = 3 
def unpivot(frame): 
    N, K = frame.shape 
    data = {'value' : frame.values.ravel('F'), 
      'variable' : np.asarray(frame.columns).repeat(N), 
      'date' : np.tile(np.asarray(frame.index), K)} 
    return pd.DataFrame(data, columns=['date', 'variable', 'value']) 
df = unpivot(tm.makeTimeDataFrame()) 
print (df) 

print (df.pivot(index='date', columns='variable', values='value')) 

печати (DF):

дата значение переменной
0 2000-01-03 0,101495
1 2000-01-04 A -0.554863
2 2000-01-05 A -0.345271
3 2000-01-03 B -1.10490 9
4 2000-01-04 В -0,723819
5 2000-01-05 В 0,088401
6 2000-01-03 С 1,495768
7 2000-01-04 С -0,756166
8 2000-01- 05 С -0,266072
9 2000-01-03 D 0,451050
10 2000-01-04 D -1,457763
11 2000-01-05 D 0,945552

печати (df.pivot (индекс =» date ', columns =' variable ', values ​​=' value ')):

переменная ABCD
Дата
2000-01-03 2,932572 -1,959961 0,385705 -1,629831
2000-01-04 -0,317548 0,031041 2,129526 -1,717546
2000-01-05 0,108186 1,182527 0,997716 0,453127

+0

Хм, так как я должен писать это из данных, которые я опубликовал выше? Совсем не похожа на это –

1

Вы можете использовать lreshape для создания новых столбцов, то set_index из Col, транспонирование по T и последней удалить имя столбца по rename_axis (новый в pandas0.18.0)

print (pd.lreshape(df, {'Col':['Column0', 'Column2'], 
         0:['Column1', 'Column3']}) 
     .set_index('Col') 
     .T 
     .rename_axis(None, axis=1)) 

    Entry_1 Entry_2  Entry_3 Entry_4 Entry_5 Entry_6 Entry_7  Record_1 \ 
0 0.685 0.036 05/Jul/2016 0.338 0.41 122.48  0.5 0.69-S$ 0.685 

    Record_2  Record_3 Record_4 Record_5 Record_6    Record_7 
0 0.685 0.72-S$ 0.4 178.8 mm  0.06 17.29% 0.58 as of 05/Jul/2016 
+0

Thanks Jezrael! :) –

+0

Если хочешь, можешь возвысить ;-) Спасибо. – jezrael

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