2016-07-18 60 views
3

我有這樣的數據,沒有z1,我需要的是向DataFrame添加一列,所以它將添加第z1列和表示值,它應該做的是在1天前平均移動z值爲相同的開始日期。如何使用熊貓來改變數據幀的值?

enter image description here 我想這可能與申請和lambda在大熊貓來完成,但我真的不知道如何定義lambda函數

data = pd.read_csv("....") 

data["Z"] = data[[ 
       "Start", "Z"]].apply(lambda x: 
+0

爲什麼'564545'在最後一行?不應該是'56'?因爲如果你想在同一個開始日期的前一天平均使用'z值,它將對應於'32400000 2012-10-02'(第7行)而不是'32400000 2012-10-01'(第2行)。 –

+0

是的,你是對的,這是給我的例子中的一個錯誤 –

回答

3

您可以使用DataFrameGroupBy.shiftmerge

#if not datetime 
df['date'] = pd.to_datetime(df.date) 
df.set_index('date', inplace=True) 
df1 = df.groupby('start')['z'].shift(freq='1D',periods=1).reset_index() 
print (pd.merge(df.reset_index(),df1, on=['start','date'], how='left', suffixes=('','1'))) 

     date start  z  z1 
0 2012-12-01 324 564545  NaN 
1 2012-12-01 384 5555  NaN 
2 2012-12-01 349  554  NaN 
3 2012-12-02 855  635  NaN 
4 2012-12-02 324  56 564545.0 
5 2012-12-01 341  98  NaN 
6 2012-12-03 324  888  56.0 

編輯:

嘗試找到重複項和fillna0

df['date'] = pd.to_datetime(df.date) 
df.set_index('date', inplace=True) 
df1 = df.groupby('start')['z'].shift(freq='1D',periods=1).reset_index() 
df2 = pd.merge(df.reset_index(),df1, on=['start','date'], how='left', suffixes=('','1')) 
mask = df2.start.duplicated(keep=False) 
df2.ix[mask, 'z1'] = df2.ix[mask, 'z1'].fillna(0) 
print (df2) 
     date start  z  z1 
0 2012-12-01 324 564545  0.0 
1 2012-12-01 384 5555  NaN 
2 2012-12-01 349  554  NaN 
3 2012-12-02 855  635  NaN 
4 2012-12-02 324  56 564545.0 
5 2012-12-01 341  98  NaN 
6 2012-12-03 324  888  56.0 
+0

多數民衆贊成在偉大,謝謝!但如何使用不同的數據集我得到NotImplementedError:不支持類型索引 –

+0

它看起來像你忘了dtetimeindex'df.set_index('date',inplace = True)'。 – jezrael

+0

仍然不明白爲什麼它不想工作 –