Как игнорировать указанный столбец c в кадре данных при агрегировании - PullRequest
0 голосов
/ 04 мая 2020

Есть ли способ сделать pandas групповую агрегацию на фрейме данных и вернуть определенную строку из столбца? У меня есть такой фрейм данных:

lst = [[ 100, 'buicks', .001, np.nan, np.nan], [101, 'chevy', .002, np.nan, np.nan],
       [102, 'olds', .003, .006, np.nan], [100, 'buick', np.nan, .004, np.nan],
       [103, 'nissan', np.nan, np.nan, .1], [103,'nissans', np.nan, .14, np.nan]]
df = pd.DataFrame(lst, columns=['car_id', 'name', 'aa', 'bb', 'cc'])
   car_id     name     aa     bb   cc
0     100   buicks  0.001    NaN  NaN
1     101    chevy  0.002    NaN  NaN
2     102     olds  0.003  0.006  NaN
3     100    buick    NaN  0.004  NaN
4     103   nissan    NaN    NaN  0.1
5     103  nissans    NaN  0.140  NaN

Нужно это:

0     100   buicks  0.001  0.004  NaN
1     101    chevy  0.002    NaN  NaN
2     102     olds  0.003  0.006  NaN
4     103  nissans    NaN  0.140  0.1

Что я пытаюсь сделать, это сгруппировать по столбцу car_id, а затем суммировать столбцы aa, bb, cc. Тем не менее, значения столбца имени могут не совпадать, но мне нужно сохранить одно из них. Мне все равно, какой. Я смотрел: Pandas сумма по группам, но исключил определенные столбцы и в итоге получилось что-то вроде этого:

df.groupby('car_id').agg({'aa': np.sum, 'bb': np.sum, 'cc':np.sum})

Но это отбрасывает столбец имени. Я предполагаю, что могу добавить столбец имени к приведенному выше выражению, и есть операция, которую я могу вставить туда, чтобы вернуть строку.

Спасибо

Ответы [ 4 ]

2 голосов
/ 04 мая 2020

Да, действительно, вы можете использовать first для столбца name:

df.groupby('car_id').agg({'name':'first',
                          'aa':'sum',
                          'bb':'sum',
                          'cc':'sum'})

Вывод:

          name     aa     bb   cc
car_id                           
100     buicks  0.001  0.004  0.0
101      chevy  0.002  0.000  0.0
102       olds  0.003  0.006  0.0
103     nissan  0.000  0.140  0.1
1 голос
/ 04 мая 2020

Здесь с лямбдой, если вы хотите использовать NaN:

df.groupby('car_id').agg({'name':'first', 'aa':'sum', 'bb':'sum', 'cc': lambda x: x.sum(skipna=False)})
0 голосов
/ 04 мая 2020
pd.concat([df.groupby('car_id').apply(lambda x: x.head(1))[['car_id','name']].set_index('car_id'), \
df.groupby('car_id').agg({'aa': np.sum, 'bb': np.sum, 'cc':np.sum}).reset_index().set_index('car_id')], axis = 1).reset_index()


    car_id  name    aa  bb  cc
0   100 buicks  0.001   0.004   0.0
1   101 chevy   0.002   0.000   0.0
2   102 olds    0.003   0.006   0.0
3   103 nissan  0.000   0.140   0.1
0 голосов
/ 04 мая 2020

Для удовлетворения ваших результатов

s=df.groupby(['car_id'])[['aa','bb','cc']].sum(min_count=1)
s['name']=df.drop_duplicates('car_id').set_index('car_id').name
s
Out[185]: 
           aa     bb   cc    name
car_id                           
100     0.001  0.004  NaN  buicks
101     0.002    NaN  NaN   chevy
102     0.003  0.006  NaN    olds
103       NaN  0.140  0.1  nissan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...