基于组计数的Pandas数据帧过滤

时间:2017-06-27 05:53:54

标签: python pandas

我的数据框如下所示:

item_id       sales_quantity
   1              10             
   1              11 
   1              1 
   1              2
   ...            ...
   10             1
   10             9
   ...            ...

我想过滤掉与item_id相对应的所有行,这些行显示的次数少于100次。这是我试过的:

from pandas import *
from statsmodels.tsa.stattools import adfuller
def adf(X):

    result = adfuller(X)
    print('ADF Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    print('Critical Values:')
    for key, value in result[4].items():
        print('\t%s: %.3f' % (key, value))


filtered = df.groupby('item_id_copy')['sales_quantity'].filter(lambda x: len(x) >= 100)
df[df['sales_quantity'].isin(filtered)]
df['sales_quantity'].groupby(df['item_id_copy']).apply(adf)

但是,当我运行以下内容时: df['sales_quantity'].groupby(df['item_id_copy']).size(),我收到了大量小于100的item_ids。有人可以告诉我我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

您似乎需要删除['sales_quantity']

df = df.groupby('item_id_copy').filter(lambda x: len(x) >= 100)

或者:

df = df[df.groupby('item_id_copy')['sales_quantity'].transform('size') > 100]

样品:

np.random.seed(130)
df=pd.DataFrame(np.random.randint(3, size=(10,2)), columns=['item_id_copy','sales_quantity'])
print (df)
   item_id_copy  sales_quantity
0             1               1
1             1               2
2             2               1
3             0               1
4             2               0
5             2               0
6             0               1
7             1               2
8             1               2
9             1               2

df1 = df.groupby('item_id_copy').filter(lambda x: len(x) >= 4)
print (df1)
   item_id_copy  sales_quantity
0             1               1
1             1               2
7             1               2
8             1               2
9             1               2

df1 = df[df.groupby('item_id_copy')['sales_quantity'].transform('size') >= 4]
print (df1)
   item_id_copy  sales_quantity
0             1               1
1             1               2
7             1               2
8             1               2
9             1               2

编辑:

对于应用后的列,可以添加一些函数Series构造函数,然后按unstack重新整形。最后从列DataFramejoin中的dicts创建新的Critical Values到原始版本:

np.random.seed(130)
df = pd.DataFrame(np.random.randint(10, size=(1000,2)), 
                  columns=['item_id_copy','sales_quantity'])
#print (df)

from statsmodels.tsa.stattools import adfuller

def adf(X):
    result = adfuller(X)
    return pd.Series(result, index=['ADF Statistic','p-value','a','b','Critical Values','c'])

df1 = df[df.groupby('item_id_copy')['sales_quantity'].transform('size') >= 100]


df2 = df1['sales_quantity'].groupby(df1['item_id_copy']).apply(adf).unstack()
df3 = pd.DataFrame(df2['Critical Values'].values.tolist(),
                   index=df2.index, 
                   columns=['1%','5%','10%'])
df2=df2[['ADF Statistic','p-value']].join(df3).reset_index()
print (df2)
   item_id_copy ADF Statistic      p-value        1%        5%       10%
0             1      -12.0739   2.3136e-22 -3.498198 -2.891208 -2.582596
1             2      -4.48264  0.000211343 -3.494850 -2.889758 -2.581822
2             7       -4.2745  0.000491609 -3.491818 -2.888444 -2.581120
3             9      -11.7981  9.47089e-22 -3.486056 -2.885943 -2.579785