2015-09-03 5 views
1

У меня есть два DataFrame, каждый из которых имеет одно и то же имя столбца и некоторые имена строк; например, один CSV файл с этим содержимым:Reshaping pandas DataFrame

Location method reading date 
1    M  2.8 12-Jun 
1    A  3  12-Jun 
2    M  2.5 12-Jun 
2    A  3.1 12-Jun 
3    M  4  12-Jun 
3    A  2.2 12-Jun 

и другое одно с этим содержанием:

Location method reading date 
    1   M  2.9 13-Jun 
    1   A  3  13-Jun 
    2   M  2.6 13-Jun 
    2   A  3.1 13-Jun 
    3   M  3.9 13-Jun 
    3   A  2.2 13-Jun 

Я хотел бы организовать их в DataFrame, которые выглядят так:

  1/M 1/A 2/M 2/A 3/M 3/A 
12-Jun 2.8  3 2.5 3.1 4  2.2 
13-Jun 2.9  3 2.6 3.1 3.9 2.2 

, где каждое имя столбцов dataframe - каждое местоположение + каждый метод (пример: 1/M для местоположения 1 и метод M). Как это можно сделать эффективным образом. Я написал что-то вроде этого:

data1=pd.read_csv("csv1.csv") 
data2=pd.read_csv("csv2.csv") 
list1={} 
list2={} 


for index, row in data1.iterrows(): 
    list=[] 
    list.append(row["date"]) 
    list.append(row["reading"]) 
    list1[row["location"]+row["method"]]=list 

но я застрял там.

ответ

1

Позвольте df быть первым информационным блоком. Я хотел бы использовать метод поворота как:

d = pd.pivot_table(df,index='date',columns=['Location','method'], values='reading') 

, которая возвращает:

Location 1   2   3 
method A M A M A M 
date        
12-Jun 3 2.8 3.1 2.5 2.2 4 

Тогда я бы объединить имена столбцов уровней, чтобы получить новый список столбцов:

L = [] 

for index,row in d.columns: 
    c = str(index) + '/' + str(row) 
    L.append(c) 

и затем назначьте новый список L в качестве столбцов фрейма данных:

d.columns = L 

Результат:

 1/A 1/M 2/A 2/M 3/A 3/M 
date         
12-Jun 3 2.8 3.1 2.5 2.2 4 

Надежда, что помогает. Те же самые работы объединяют два блока данных.

Edit:

Если df1 является первым dataframe и df2 во-вторых, вы можете объединить их в один df с:

df = df1.append(df2) 

, а затем применить метод над ним.

+0

pd.pivot() дайте мне эту ошибку: pandas.core.groupby.DataError: Нет числовых типов для объединения – user3841581

+0

Попробуйте 'pd.pivot_table()', для меня это работает. –

+0

Когда я пытаюсь, он дает мне ту же ошибку. – user3841581

1

Функция, которую вы ищете, это pivot. Убедитесь, что вы читаете учебник здесь:

http://pandas.pydata.org/pandas-docs/stable/reshaping.html

Тот факт, что данные поступают в двух dataframes не имеет отношения, поэтому я сцепляются их, чтобы начать с:

df = pd.concat([data1, data2], ignore_index=True) 
df['loc_method'] = df['Location'].astype('str') + '/' + df['method'] 
df.pivot(index='date', columns='loc_method', values='reading') 

Результат:

loc_method 1/A 1/M 2/A 2/M 3/A 3/M 
date          
12-Jun  3 2.8 3.1 2.5 2.2 4.0 
13-Jun  3 2.9 3.1 2.6 2.2 3.9 
+0

это дает мне ошибку: pandas.core.groupby.DataError: Нет числовых типов для объединения – user3841581

+0

Попробуйте ответить [здесь] (http://stackoverflow.com/questions/25397057/getting-average-of-pandas-with не -groupby пробивной-dataerror-не-числовые типы-к-а-). Чтение столбца в вашем фреймворке, вероятно, не является числовым. – IanS

+0

Вы правы, я просмотрел некоторые из моих данных, и я узнал, что действительно есть некоторые, которые не являются числовыми; когда я пытаюсь использовать его, он дает мне эту ошибку: ValueError: не удалось преобразовать строку в float: OOR. Как это сделать, чтобы использовать функцию pibot? Спасибо – user3841581