2016-01-16 3 views
0

Скажем, у меня есть следующий dataframe:Pivot Панды Dataframe и вычислить параметр «столбцов»

import pandas as pd 

df = pd.DataFrame() 
df['ID'] = [1, 1, 1, 2, 2] 
df['Type'] = ['A', 'B', 'Q', 'B', 'R'] 
df['Status'] = [0, 0, 1, 0, 1] 
>>> df 
    ID Type Status 
0 1 A  0 
1 1 B  0 
2 1 Q  1 
3 2 B  0 
4 2 R  1 
>>> 

Я хочу, чтобы сгруппировать этот dataframe на «ID» и изменить его так, что у меня есть «тип» переменной и Переменная «Статус» для каждого элемента в группе. Смотрите ниже:

Type1 Type2 Type3 Status1 Status2 Status3 
ID            
1  A  B  Q  0  0  1 
2  B  R NaN  0  1  NaN 

Число строк в моем выходном dataframe будет зависеть от максимального количества записей в любой одной группе идентификаторов.

Я считаю, что функция pivot - это то, что я хочу использовать здесь. Тем не менее, он вызывает параметр «столбцы», который, я считаю, должен быть идентификатором каждого элемента в каждой группе. У меня есть очень неуклюжий способ вычисления этого, который я ценю советы по лучшему способу сделать это:

>>> g=df.groupby('ID') 
>>> df['IDinGroup']=[item for sublist in [range(1,len(i[1])+1) for i in g] for item in sublist] 
>>> df 
    ID Type Status IDinGroup 
0 1 A  0   1 
1 1 B  0   2 
2 1 Q  1   3 
3 2 B  0   1 
4 2 R  1   2 
>>> 

Тогда я могу перебрать «Тип» и переменные «Статус» и поворот каждого, а затем объединить их назад вместе:

>>> ListOfValues=[] 
>>> for ValueCol in ['Type','Status']: 
...  f=df.pivot(index='ID',columns='IDinGroup',values=ValueCol) 
...  f.columns=[ValueCol+str(Col) for Col in f.columns] 
...  f.columns.name=None 
...  ListOfValues.append(f) 
... 
>>> pd.concat(ListOfValues,1) 
    Type1 Type2 Type3 Status1 Status2 Status3 
ID            
1  A  B  Q  0  0  1 
2  B  R NaN  0  1  NaN 
>>> 

Я принимаю правильный подход здесь? И если да, то какой способ лучше вычислить параметр «столбцы» для функции поворота? (Идентификатор каждого элемента в каждой группе)

ответ

1

Попробуйте это:

import pandas as pd 

df = pd.DataFrame() 
df['ID'] = [1, 1, 1, 2, 2] 
df['Type'] = ['A', 'B', 'Q', 'B', 'R'] 
df['Status'] = [0, 0, 1, 0, 1] 

g = df.groupby("ID")[["Type","Status"]] 
df2 = g.apply(pd.DataFrame.reset_index, drop=True).unstack() 

Вот результат:

Type   Status  
     0 1 2  0 1 2 
ID       
1  A B Q  0 0 1 
2  B R NaN  0 1 NaN 

Столбцы является мультииндексным, если вы хотите плоский него:

df2.columns = [l0 + str(l1+1) for l0, l1 in df2.columns] 

выход:

Type1 Type2 Type3 Status1 Status2 Status3 
ID            
1  A  B  Q  0  0  1 
2  B  R NaN  0  1  NaN 
+0

Это замечательно, спасибо. – AJG519

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