我的数据框如下所示:
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。有人可以告诉我我的代码有什么问题吗?
答案 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
重新整形。最后从列DataFrame
和join
中的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