Найти строки с наибольшим значением на основе одной группы в столбце и оси в пандах - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующий кадр данных панд:

id  val city    
4   78  a   
4   12  b   
4   50  c   

9   20  d   
9   8   e   
9   30  f   
9   17  g   

Я хочу преобразовать его в следующую форму. Внутри каждой группы 'id' получите самые длинные строки (в данном случае n = 2) на основе 'val'. например 78 и 50 в группе с идентификатором 4 и 30 и 20 в группе с идентификатором 9

id  val city    
4   78  a   
4   50  c   

9   30  f   
9   20  d   

Наконец, поверните таблицу следующим образом:

id  c_1stLrgst  c_1Lrgst_val    c_2ndLrgst  c_2Lrgst_val...c_nLrgst c_nLrgst_val
4   a           78              c           50
9   f           30              d           20

Я могу получить группы, используя df.groupby('id').nlargest(2, 'val'). Не уверен, что делать дальше.

import pandas as pd
df_dict = {'id': [4,4,4,9,9,9,9],
            'val':[78,12,50,20,8,30,17],    
            'city':['a', 'b', 'c', 'd', 'e', 'f', 'g'], 
            };
df = pd.DataFrame(df_dict);

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать sort_values + groupby.head, за которым следует еще groupby до list. Затем разделите списки и объедините.

# sort by "val" descending and extract first 2 rows from each group
df_filtered = df.sort_values('val', ascending=False)\
                .groupby('id').head(2)

groupvars = ['city', 'val']

# groupby city and val
g = df_filtered.groupby('id')[groupvars].agg(list)

# split lists and create dataframe for each group key
L = [pd.DataFrame(g[x].values.tolist(), index=res.index).add_prefix(x) for x in groupvars]

# concatenate results
res = pd.concat(L, axis=1)

print(res)

   city0 city1  val0  val1
id                        
4      a     c    78    50
9      f     d    30    20
...