使用分类键对DataFrame中的值进行排序,而不使用groupby Split Apply Combine

时间:2018-06-06 18:36:43

标签: python pandas pandas-groupby

所以...我有一个看起来像这样的Dataframe,但更大:

    DATE        ITEM    STORE   STOCK
0   2018-06-06     A    L001    4
1   2018-06-06     A    L002    0
2   2018-06-06     A    L003    4
3   2018-06-06     B    L001    1
4   2018-06-06     B    L002    2

您可以使用以下代码重现相同的DataFrame

import pandas as pd
import numpy as np
import itertools as it

lojas = ['L001', 'L002', 'L003']
itens = list("ABC")
dr = pd.date_range(start='2018-06-06', end='2018-06-12')

df = pd.DataFrame(data=list(it.product(dr, itens, lojas)), columns=['DATE', 'ITEM', 'STORE'])
df['STOCK'] = np.random.randint(0,5, size=len(df.ITEM))

我想计算每个ITEM-STORE中的天数之间的de STOCK差异,并且使用函数.diff()可以轻松地使用函数 DATE ITEM STORE STOCK DELTA 0 2018-06-06 A L001 4 NaN 9 2018-06-07 A L001 0 -4.0 18 2018-06-08 A L001 4 4.0 27 2018-06-09 A L001 0 -4.0 36 2018-06-10 A L001 3 3.0 45 2018-06-11 A L001 2 -1.0 54 2018-06-12 A L001 2 0.0 迭代groupby对象中的组:

gg = df.groupby([df.ITEM, df.STORE])
lg = []

for (name, group) in gg:
    aux = group.copy()
    aux.reset_index(drop=True, inplace=True)
    aux['DELTA'] = aux.STOCK.diff().fillna(value=0, inplace=Tr

    lg.append(aux)

df = pd.concat(lg) 

我设法通过以下代码执行此操作:

String

但是在大​​型DataFrame中,它变得不切实际。是否有更快更多的pythonic方式来完成这项任务?

1 个答案:

答案 0 :(得分:1)

我试图改进你的groupby代码,所以这应该快得多。

v = df.groupby(['ITEM', 'STORE'], sort=False).STOCK.diff()
df['DELTA'] = np.where(np.isnan(v), 0, v)

这里有一些指示/想法:

  1. 不要迭代群组
  2. 如果系列属于同一个DataFrame,请不要将系列作为石斑鱼传递。改为传递字符串标签。
  3. diff可以进行矢量化
  4. 最后一行等同于fillna,但fillna慢于np.where
  5. 指定sort=False将阻止输出按石斑键排序,从而进一步提高性能
  6. 这也可以重写为

    df['DELTA'] = df.groupby(['ITEM', 'STORE'], sort=False).STOCK.diff().fillna(0)