данные агрегации панд при переносе столбца без изменений - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных, a:

a=pd.DataFrame({'ID': [1,1,2,2,3,4], 'B': [1,5,3,2,4,1], 'C': [1,4,3,6,1,1]})

   ID  B  C
0   1  1  1
1   1  5  4
2   2  3  3
3   2  2  6
4   3  4  1
5   4  1  1

И я хочу агрегировать его так, чтобы результирующий новый фрейм данных был сгруппирован по ID и возвращал строку, соответствующую min of B (поэтому применитеmin () на B и несет C как есть.

Таким образом, результирующий фрейм данных должен быть:

   ID  B  C
0   1  1  1
1   2  2  6
2   3  4  1
3   4  1  1

Как я могу сделать это программно, используя pandas.groupby(), или есть другой способсделать это?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Когда включена сортировка, а группировка не требует каких-либо вычислений, я предпочитаю работать с базовыми numpy массивами для повышения производительности.


Использование argsort и numpy.unique:

arr = a.values
out = arr[np.argsort(arr[:, 1])]
_, idx = np.unique(out[:, 0], return_index=True)

out[idx]

array([[1, 1, 1],
       [2, 2, 6],
       [3, 4, 1],
       [4, 1, 1]], dtype=int64)

Чтобы переназначить значения в ваш DataFrame:

pd.DataFrame(out[idx], columns=a.columns)

   ID  B  C
0   1  1  1
1   2  2  6
2   3  4  1
3   4  1  1
0 голосов
/ 28 сентября 2018

Вы можете использовать группирование и преобразование для фильтрации строк

a.loc[a['B'] == a.groupby('ID').B.transform('min')]

    B   C   ID
0   1   1   1
3   2   6   2
4   4   1   3
5   1   1   4
0 голосов
/ 28 сентября 2018

Попробуйте выполнить сортировку перед вашим groupby, затем примите first:

a.sort_values('B').groupby('ID',as_index=False).first()

   ID  B  C
0   1  1  1
1   2  2  6
2   3  4  1
3   4  1  1

Или, возможно, более быстрый способ сделать это - отсортировать по ID и B, а затем удалить дубликатID с, сохраняя первое (которое по умолчанию drop_duplicates):

a.sort_values(['ID','B']).drop_duplicates('ID')

   ID  B  C
0   1  1  1
1   2  2  6
2   3  4  1
3   4  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...