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

dfexample = pd.DataFrame({'OID' : [7, 7, 7, 7],
                      'Category' : ['Plumbing', 'Plumbing', 'Plumbing', 'Plumbing'],
                      'Product_Type' : ['Accessory', 'Shower Accessories', 'Showers', 'Showers'],
                      'Extended_Price' : [20.5, 12.12, 122.45, 225.98]})

Я хочу сгруппировать этот фрейм данных по 'OID' и получить 'первую' строку столбцов моего объекта (Category и Product_Type), поэтому в этом случае 'plumbing' и {{X3} } . Желаемый результат:

[in]:dfgrouped

[out]:
OID       Category         Extended_Price     Product_Type
7         Plumbing         381.05             Accessory  

Прямо сейчас у меня есть это, которое объединяет все строки вместе, и не возвращает «первую» строку.

def f(x):
return pd.Series(dict(Category = x['Category'].sum(),
                     Extended_Price = x['Extended_Price'].sum(),
                      Product_Type = x['Product_Type'].sum() 
                     ))
dfexample.groupby('OID').apply(f)
1
Hound 11 Янв 2017 в 21:58

3 ответа

Лучший ответ

Метод first groupby возвращает первый элемент каждой группы:

dfexample.groupby('OID').first()

Очевидно, вы также хотите суммировать числовой столбец, поэтому вам нужно использовать agg, чтобы указать, какую агрегацию использовать для каждого столбца:

dfexample.groupby('OID').agg({
    'Category': 'first',
    'Product_Type': 'first',
    'Extended_Price': 'sum'
})
5
IanS 11 Янв 2017 в 19:05

Я хотел бы объединить @ IanS's и @ piRSquared's отличные решения и попытается обобщить решение:

In [135]: funcs = {col:'sum' if dfexample[col].dtype == np.number
                             else 'first'
                   for col in dfexample.drop('OID', 1).columns}

In [136]: dfexample.groupby('OID').agg(funcs)
Out[136]:
     Category Product_Type  Extended_Price
OID
7    Plumbing    Accessory          381.05

Объяснение :

In [134]: {col:'sum' if dfexample[col].dtype == np.number else 'first'  for col in dfexample.drop('OID', 1).columns}
Out[134]: {'Category': 'first', 'Extended_Price': 'sum', 'Product_Type': 'first'}
2
Community 23 Май 2017 в 10:29

Использовать select_dtypes с groupby

dfexample.select_dtypes([object]).groupby(dfexample.OID).first()

     Category Product_Type
OID                       
7    Plumbing    Accessory
3
piRSquared 11 Янв 2017 в 19:03