Панды Сводные данные, отличные от определенного значения в определенном столбце - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть такие данные в Python Dataframe Python

df = pd.DataFrame({
         'ID':range(1, 8),
         'Type':list('XXYYZZZ'),
         'Value':[2,3,2,9,6,1,4]

})

Результат, который я хочу сгенерировать:

enter image description here

Как я могу генерировать эти результаты, используя Python DataFrame панда.Я хочу включить все значения Y столбца типа и не хочу их агрегировать.

1 Ответ

0 голосов
/ 18 февраля 2019

Первые значения фильтра по boolean indexing, строки агрегирования и добавления фильтра, последняя сортировка:

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID'))
print (df1)
   ID Type  Value
0   1    X      5
2   3    Y      2
3   4    Y      9
1   5    Z     11

Если требуется диапазон 1 до length of data для IDcolumn:

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID')
                .assign(ID = lambda x:  np.arange(1, len(x) + 1)))
print (df1)
   ID Type  Value
0   1    X      5
2   2    Y      2
3   3    Y      9
1   4    Z     11

Другая идея заключается в создании вспомогательного столбца для уникальных значений только для Y строк и агрегирования по обоим столбцам:

mask = df['Type'] == 'Y'
df['g'] = np.where(mask, mask.cumsum() + 1, 0)

df1 = (df.groupby(['Type','g'], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})
        .drop('g', axis=1)[['ID','Type','Value']])

print (df1)
   ID Type  Value
0   1    X      5
1   3    Y      2
2   4    Y      9
3   5    Z     11

Аналогичная альтернатива для Series g, затемdrop не обязательно:

mask = df['Type'] == 'Y'
g = np.where(mask, mask.cumsum() + 1, 0)
df1 = (df.groupby(['Type',g], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})[['ID','Type','Value']])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...