pandas在迭代同样的情况下更改数据帧

时间:2017-09-12 10:20:51

标签: python pandas statistics mean

我是熊猫的初学者。 用例是,我有两个数据帧,一个包含实际数据(比如说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(行)打印更新的列值,但最后,df1.head()按原样打印原始数据帧。这是有道理的,因为当我们改变" row"变量,我们实际上是在更改快照/实例而不是实际数据帧的内容。

预期输出:每年平均值1B PAR,2B PAR ...... 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 个答案:

答案 0 :(得分: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上的两个数据帧,然后按列进行减法并删除均值列。