2017-04-13 47 views
1

我試圖檢測事件發生時的第一個日期:在我的產品A的數據框中的這裏(請參閱數據透視表)我在2017年第一次存儲了20個項目-04-03。循環成日期並將函數應用到熊貓數據框中

所以我想創建一個新變量calle new_var_2017-04-03來存儲增量。另一方面在第二天2017-04-04我不介意如果該項目是現在50而不是20,我只想存儲只有第一個事件

它給了我幾個錯誤,我想至少知道,如果它背後的整個邏輯是有道理的,它的「Python化」,或者如果我在

raw_data = {'name': ['B','A','A','B'],'date' : pd.to_datetime(pd.Series(['2017-03-30','2017-03-31','2017-04-03','2017-04-04'])), 
    'age': [10,20,50,30]} 
df1 = pd.DataFrame(raw_data, columns = ['date','name','age']) 


table=pd.pivot_table(df1,index=['name'],columns=['date'],values=['age'],aggfunc='sum') 
table 

我傳遞的日期列表

dates=df1['date'].values.tolist() 
走錯了路completeley

我想在列表「日期」中做一個反向循環,並在事件發生時創建一個變量。 僞代碼:與I-1我之前,我指的是在列表中的項目

def my_fun(x,list): 
    for i in reversed(list): 
     if (x[i]-x[i-1])>0 : 
      x[new_var+i]=x[i]-x[i-1] 
    else: 
     x[new_var+i]=0 
return x 

print (df.apply(lambda x: my_fun(x,dates), axis=1)) 

desidered輸出:

raw_data2 = {'new_var': ['new_var_2017-03-30','new_var_2017-03-31','new_var_2017-04-03','new_var_2017-04-04'],'result_a': [np.nan,20,np.nan,np.nan],'result_b': [10,np.nan,np.nan,np.nan]} 
df2= pd.DataFrame(raw_data2, columns = ['new_var','result_a','result_b']) 

df2.T 
+0

您可以發佈您需要的數據組? – MaxU

+0

希望添加的結果,謝謝 – progster

回答

2

讓我們試試這個:

df1['age'] = df1.groupby('name')['age'].transform(lambda x: (x==x.min())*x) 
df1.pivot_table(index='name', columns='date', values='age').replace(0,np.nan) 


date 2017-03-30 2017-03-31 2017-04-03 2017-04-04 
name             
A   NaN  20.0   NaN   NaN 
B   10.0   NaN   NaN   NaN 
+0

它的工作原理謝謝,但我不明白這背後的邏輯:(x == x.min())* x)。你計算x的最小值,並將其應用於帶有lambda函數的df,...什麼? – progster

+0

對於'x'的每個值都通過檢查以確定它是否是最小值。如果是,則(x == x.min())計算爲True。它會被轉換爲1.0 * x。否則,它評估爲False,它被轉換爲0.0。所以,1 *最小值和0 *其他值。 groupby將組的年齡傳遞到lambda函數,因此它需要找到該組的最小值,並將其乘以一,其他值乘以0. –

+0

或df1 ['age'] = df1.groupby('name') ['age']。transform(lambda x:np.where(x == x.min(),x,np.nan)) –