Pandas Groupby:如何获得第一个字符串

时间:2017-01-11 18:58:38

标签: python pandas

我有这个数据框:

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'”对这个数据框进行分组,并获得“第一个'我的对象列的字符串(CategoryProduct_Type),所以在这种情况下'plumbing''accessory'。期望的输出:

[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)

3 个答案:

答案 0 :(得分:5)

Content-Type:text/html; charset=utf-8 groupby方法返回每个组的第一个元素:

first

显然,您还想对数字列求和,因此您需要使用dfexample.groupby('OID').first() 来指定要用于每列的聚合:

agg

答案 1 :(得分:3)

select_dtypesgroupby

一起使用
dfexample.select_dtypes([object]).groupby(dfexample.OID).first()

     Category Product_Type
OID                       
7    Plumbing    Accessory

答案 2 :(得分:2)

我会将@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'}