Найти максимум в Dataframe на основе значений переменных - PullRequest
2 голосов
/ 09 января 2020

У меня есть кадр данных в виде:

A| B| C | D
a| x| r | 1
a| x| s | 2
a| y| r | 1
b| w| t | 4
b| z| v | 2

Я хотел бы иметь возможность возвращать что-то вроде (показывая уникальные значения и частоту)

A| freq of most common value in Column B |maximum of column D based on the most common value in Column B | most common value in Column B
a       2                                                  2                                                           x
b       1                                                  4                                                           w

на данный момент я могу вычислить все, кроме 3-х столбцов результирующего фрейма данных тихо быстро через

df = (df.groupby('A', sort=False)['B']
    .apply(lambda x: x.value_counts().head(1))
    .reset_index()

, но для вычисления 2-х столбцов («максимум столбца D на основе наиболее распространенного значения в столбце B») у меня есть написано для-l oop ведьма медленно для большого количества данных. Есть ли быстрый способ?

Вопрос связан с: Подсчет значений в кадре данных на основе записи

Ответы [ 2 ]

5 голосов
/ 09 января 2020

Используйте merge с получением строк максимумом D для групп по DataFrameGroupBy.idxmax:

df1 = (df.groupby('A', sort=False)['B']
        .apply(lambda x: x.value_counts().head(1))
        .reset_index()
        .rename(columns={'level_1':'E'}))
#print (df1)

df = df1.merge(df, left_on=['A','E'], right_on=['A','B'], suffixes=('','_'))
df = df.loc[df.groupby('A')['D'].idxmax(), ['A','B','D','E']]
print (df)
   A  B  D  E
1  a  2  2  x
2  b  1  4  w
2 голосов
/ 09 января 2020

Попробуйте сделать это в 3 шага:

  1. найти наиболее распространенный B (как в вашем коде):

df2 = (df.groupby('A', sort=False)['B']).apply(lambda x: x.value_counts().head(1)).reset_index()

построить DataFrame с максимальным D для каждой комбинации A и B

df3 = df.groupby(['A','B']).agg({'D':max}).reset_index()

объедините 2 кадра данных, чтобы найти максимальное D, соответствующее ранее выбранным парам AB

df2.merge(df3, left_on=['A','level_1'], right_on=['A','B'])

Столбец D в результирующем кадре данных будет тем, что вам нужно

   A level_1  B_x B_y  D
0  a       x    2   x  2
1  b       w    1   w  4
...