2017-06-27 115 views
1

我的數據框看起來是這樣的:熊貓據幀過濾統計

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

我想篩選出對應於出現小於100倍item_id的所有行。這裏是我的嘗試:

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

看來你需要刪除['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重塑。最後在Critical Values柱和join創建類型的字典新DataFrame原始:

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 
+0

我看到'item_id'計數均高於和低於100,當我運行上述語句('DF [「sales_quantity」] GROUPBY更大。 (df ['item_id_copy'])。size()') – user1274878

+0

嗯,我不確定是否理解。 'groupby'的'filter'應該返回所有組的條件。它不適合你? – jezrael

+0

我添加一些示例,給我一些時間。 – jezrael