首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫群和聚合输出应包括所有原始列(包括未聚合的列)。

熊猫群和聚合输出应包括所有原始列(包括未聚合的列)。
EN

Stack Overflow用户
提问于 2017-11-17 22:59:48
回答 2查看 54.8K关注 0票数 31

我有以下数据框架,并希望:

  • month分组记录
  • 每个唯一的QTY_SOLDNET_AMT之和(每月)
  • 在生成的dataframe中也包括其余的列。

我认为我可以这样做的方式是:创建一个month列来聚合D_DATES,然后通过UPC_IDQTY_SOLD相加。

剧本:

代码语言:javascript
复制
# Convert date to date time object
df['D_DATE'] = pd.to_datetime(df['D_DATE'])

# Create aggregated months column
df['month'] = df['D_DATE'].apply(dt.date.strftime, args=('%Y.%m',))

# Group by month and sum up quantity sold by UPC_ID
df = df.groupby(['month', 'UPC_ID'])['QTY_SOLD'].sum()

目前的数据框架:

代码语言:javascript
复制
UPC_ID | UPC_DSC | D_DATE | QTY_SOLD | NET_AMT
----------------------------------------------
111      desc1    2/26/2017   2         10 (2 x $5)
222      desc2    2/26/2017   3         15
333      desc3    2/26/2017   1         4
111      desc1    3/1/2017    1         5
111      desc1    3/3/2017    4         20

期望产出:

代码语言:javascript
复制
MONTH | UPC_ID | QTY_SOLD | NET_AMT | UPC_DSC
----------------------------------------------
2017-2      111     2         10       etc...
2017-2      222     3         15
2017-2      333     1         4
2017-3      111     5         25

实际产出:

代码语言:javascript
复制
MONTH | UPC_ID  
----------------------------------------------
2017-2      111     2
            222     3
            333     1
2017-3      111     5
...  

问题:

  • 如何包括每行的月份?
  • 如何包含dataframe的其余列?
  • 如何将NET_AMTQTY_SOLD相加?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-17 23:04:53

函数的aggdict

创建函数的dict并将其传递给agg。您还需要as_index=False来防止组列成为输出中的索引。

代码语言:javascript
复制
f = {'NET_AMT': 'sum', 'QTY_SOLD': 'sum', 'UPC_DSC': 'first'}
df.groupby(['month', 'UPC_ID'], as_index=False).agg(f)

     month  UPC_ID UPC_DSC  NET_AMT  QTY_SOLD
0  2017.02     111   desc1       10         2
1  2017.02     222   desc2       15         3
2  2017.02     333   desc3        4         1
3  2017.03     111   desc1       25         5

毛毯sum

只需调用没有任何列名的sum即可。这将处理数字列。对于UPC_DSC,您需要单独处理它。

代码语言:javascript
复制
g = df.groupby(['month', 'UPC_ID'])
i = g.sum()
j = g[['UPC_DSC']].first()

pd.concat([i, j], 1).reset_index()

     month  UPC_ID  QTY_SOLD  NET_AMT UPC_DSC
0  2017.02     111         2       10   desc1
1  2017.02     222         3       15   desc2
2  2017.02     333         1        4   desc3
3  2017.03     111         5       25   desc1
票数 38
EN

Stack Overflow用户

发布于 2017-11-17 23:11:38

我在想这么长时间了,谢谢你的问题,让我用aggif...else把它写成

代码语言:javascript
复制
df.groupby(['month', 'UPC_ID'],as_index=False).agg(lambda x : x.sum() if x.dtype=='int64' else x.head(1))
Out[1221]: 
   month  UPC_ID UPC_DSC     D_DATE  QTY_SOLD  NET_AMT
0      2     111   desc1 2017-02-26         2       10
1      2     222   desc2 2017-02-26         3       15
2      2     333   desc3 2017-02-26         1        4
3      3     111   desc1 2017-03-01         5       25
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47360510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档