分组和计算唯一天数

时间:2017-07-07 10:30:05

标签: python python-2.7 pandas

我有一个Pandas DataFrame,其中包含以下列:

COLS=['DATA','DSC_MATERIAL','DSC_FORNECEDOR','MTR_QUANTIDADE','MTR_VALOR','PRECO']
df2=df[COLS]

我正在尝试使用groupby来分析数据,我正在使用此代码:

f={'MTR_VALOR':['sum'],'MTR_QUANTIDADE':['sum'],'preco':['mean'], 'DATE': lambda x: x.nunique()}
df_milho.groupby(['DSC_MATERIAL','DSC_FORNECEDOR']).agg(f)

对于DATE,我想要唯一日期的数量,但我得到的是以下内容:

Sample result

我假设这是因为计算正确,但保持datetime64[ns]格式。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

对我而言,它在pandas 0.20.2中效果很好。

np.random.seed(45)
rng = pd.date_range('2017-04-03', periods=10)
df_milho = pd.DataFrame({'DATE': rng, 
                        'preco': np.random.randint(10, size=10), 
                        'MTR_VALOR': np.random.randint(10, size=10), 
                        'MTR_QUANTIDADE': np.random.randint(10, size=10),
                        'DSC_FORNECEDOR':list('aaeeeeeddd'), 
                        'DSC_MATERIAL':list('aaaabbbddd')})  
print (df_milho)
        DATE DSC_FORNECEDOR DSC_MATERIAL  MTR_QUANTIDADE  MTR_VALOR  preco
0 2017-04-03              a            a               8          6      3
1 2017-04-04              a            a               4          8      0
2 2017-04-05              e            a               6          7      5
3 2017-04-06              e            a               4          8      3
4 2017-04-07              e            b               9          5      4
5 2017-04-08              e            b               1          2      9
6 2017-04-09              e            b               6          8      8
7 2017-04-10              d            d               8          1      1
8 2017-04-11              d            d               8          6      5
9 2017-04-12              d            d               1          4      9

f={'MTR_VALOR':'sum','MTR_QUANTIDADE':['sum'],'preco':['mean'],'DATE': lambda x: x.nunique()}
df1 = df_milho.groupby(['DSC_MATERIAL','DSC_FORNECEDOR']).agg(f)
print (df1)
                                DATE preco MTR_QUANTIDADE MTR_VALOR
                            <lambda>  mean            sum       sum
DSC_MATERIAL DSC_FORNECEDOR                                        
a            a                     2   1.5             12        14
             e                     2   4.0             10        15
b            e                     3   7.0             16        15
d            d                     3   5.0             17        11

但似乎可以有pd.Series.nunique的其他解决方案:

f={'MTR_VALOR':'sum','MTR_QUANTIDADE':['sum'],
   'preco':['mean'], 'DATE': lambda x: pd.Series.nunique(x)}
df1 = df_milho.groupby(['DSC_MATERIAL','DSC_FORNECEDOR']).agg(f)
print (df1)
                                DATE preco MTR_QUANTIDADE MTR_VALOR
                            <lambda>  mean            sum       sum
DSC_MATERIAL DSC_FORNECEDOR                                        
a            a                     2   1.5             12        14
             e                     2   4.0             10        15
b            e                     3   7.0             16        15
d            d                     3   5.0             17        11

nuniquerename

f={'MTR_VALOR':'sum','MTR_QUANTIDADE':'sum','preco':'mean', 'DATE': 'nunique'}
d = {'DATE':'uniquedates','preco':'precomean',
    'MTR_QUANTIDADE':'MTR_QUANTIDADEsum','MTR_VALOR':'MTR_VALORsum'}
df1 = df_milho.groupby(['DSC_MATERIAL','DSC_FORNECEDOR']).agg(f).rename(columns=d)
print (df1)
                             uniquedates  precomean  MTR_QUANTIDADEsum  \
DSC_MATERIAL DSC_FORNECEDOR                                              
a            a                         2        1.5                 12   
             e                         2        4.0                 10   
b            e                         3        7.0                 16   
d            d                         3        5.0                 17   

                             MTR_VALORsum  
DSC_MATERIAL DSC_FORNECEDOR                
a            a                         14  
             e                         15  
b            e                         15  
d            d                         11