2017-09-12 229 views
0

我是熊貓的初學者。 用例是,我有一個包含實際數據的兩個dataframes一個(比如DF1):熊貓在迭代數據幀的同時改變數據幀

teamID yearID W 1B PAR  2B PAR  3B PAR  HR PAR  BB PAR 
1366 LAA 1961 70 0.147748 0.035708 0.003604 0.030958 0.111548 
1367 KC1 1961 61 0.164751 0.035982 0.007829 0.014993 0.096618 
1377 NYA 1962 96 0.167148 0.038536 0.004656 0.031952 0.093770 
1379 LAA 1962 86 0.159482 0.038027 0.005737 0.022455 0.098672 
1381 CHA 1962 85 0.165797 0.040756 0.009129 0.014998 0.101076 

我需要平均中心每年的數據。要實現,我已經創建使用以下命令獨立的機架,每年平均有(說DF2)

df2 = df1.groupby('yearID').mean() 
df2 = df1.reset_index() #not mandatory in this case! 
df2.head() 

    yearID W   1B PAR  2B PAR  3B PAR  HR PAR BB PAR 
0 1961 65.500000 0.156249 0.035845 0.005717 0.022975 0.104083 
1 1962 78.454545 0.165632 0.035853 0.006777 0.023811 0.088590 
2 1963 78.142857 0.162467 0.034020 0.006896 0.021254 0.080336 
3 1964 81.727273 0.167251 0.036336 0.006748 0.021548 0.079152 
4 1965 82.000000 0.160042 0.035539 0.006534 0.022693 0.085745 

現在,意味着中心DF1,我對循環之下運行:

for i, row in df1.iterrows(): 
    year = df2[df2['yearID']==row[1]] 
    row = row-year 
    print(row) 
df1.head() 

有趣,print(row)打印更新的列值,但最後,df1.head()按原樣打印原始數據框。這是有道理的,因爲當我們改變「行」變量時,我們實際上是在改變一個快照/實例而不是實際的數據幀的內容。

預期輸出:列的每年平均1B PAR,PAR 2B BB .... PAR應該等於0。

Two questions : 
> How do I update my dataframe(df1 in above case) as well? 
> Is there a way to subtract just the subset of columns and not all of them? Current code is subtracting yearId as well but we'd want to center just (1B PAR:BB PAR) columns 

謝謝!


PS:我只是修改我的for循環,現在我收到了預期的效果:

for i, row in df1.iterrows(): 
    year = df2[df2['yearID']==row[1]] 
    row = row-year 
    df1.set_value(i,'1B PAR', row['1B PAR']) 
    df1.set_value(i,'2B PAR', row['2B PAR']) 
    df1.set_value(i,'3B PAR', row['3B PAR']) 
    df1.set_value(i,'HR PAR', row['HR PAR']) 
    df1.set_value(i,'BB PAR', row['BB PAR']) 
df1.head() 

    teamID yearID  W  1B PAR  2B PAR  3B PAR  HR PAR BB PAR 
1366 LAA 1961 70 -0.164751 -0.000137 -0.002113 0.007983 0.007465 
1367 KC1 1961 61 -0.147748 0.000137 0.002113 -0.007983 -0.007465 
1377 NYA 1962 96 -0.164116 0.002683 -0.002121 0.008141 0.005180 

有沒有更好的實現相同的結果呢?我相信這不是完成任務的最美麗方式!

回答

1

不同的方法:

msuf = '_mean' 
dfm = pd.merge(df1,df2,on="yearID",suffixes=('',msuf)) 
for column in ["1B PAR","2B PAR","3B PAR","HR PAR","BB PAR"]: 
    dfm[column] = dfm[column] - dfm[column+msuf] 
    dfm = dfm.drop(column+msuf,axis=1) 

首先,合併上yearID兩個dataframes,然後做你的增減列明智和下降的均列。

+0

這看起來很酷,會測試一次。謝謝! – buch11

+0

如果能解決您的問題,請記住接受我的回答。 – Khris