根据pandas中的单元格值对列进行索引

时间:2017-04-25 00:24:47

标签: python pandas dataframe

我有比赛结果的数据框。我想创建一个系列,它采用最后一个阶段的位置,并在此之前通过所有阶段的平均值减去它。这是df的一小部分(可能有更多阶段,国家和行)

race_location     stage1_position  stage2_position  stage3_position  number_of_stages
AUS               2.0              2.0              NaN              2
AUS               1.0              5.0              NaN              2
AUS               3.0              4.0              NaN              2
AUS               4.0              8.0              NaN              2
AUS               10.0             6.0              NaN              2
AUS               9.0              7.0              NaN              2
FRA               23.0             1.0              10.0             3
FRA               6.0              12.0             24.0             3
FRA               14.0             11.0             14.0             3
FRA               18.0             10.0             1.0              3
FRA               15.0             14.0             4.0              3
USA               24.0             NaN              NaN              1
USA               7.0              NaN              NaN              1
USA               22.0             NaN              NaN              1
USA               11.0             NaN              NaN              1
USA               8.0              NaN              NaN              1
USA               16.0             NaN              NaN              1
USA               13.0             NaN              NaN              1
USA               19.0             NaN              NaN              1
USA               5.0              NaN              NaN              1
USA               25.0             NaN              NaN              1

输出为

last_stage_minus_average
0
4
1
4
-4
-2
-2
15
1.5             
-13            
-10.5           
0
0
0
0
0
0
0
0
0
0
0

这不会奏效,但我在考虑这样的事情:

new_series = []
for country in country_list:

    num_stages = df.loc[df['race_location'] == country, 'number_of_stages']

    differnce = df.ix[df['race_location'] == country, num_stages] -
        df.iloc[:, 0:num_stages-1].mean(axis=1)

    new_series.append(difference)

我不知道该怎么做。任何帮助或方向都会令人惊叹!

3 个答案:

答案 0 :(得分:2)

我使用filter来获取他的舞台列,然后stackgroupby

stages = df.filter(regex='^stage\d+.*')

stages.stack().groupby(level=0).apply(
    lambda x: x.iloc[-1] - x.iloc[:-1].mean()
).fillna(0)

0      0.0
1      4.0
2      1.0
3      4.0
4     -4.0
5     -2.0
6     -2.0
7     15.0
8      1.5
9    -13.0
10   -10.5
11     0.0
12     0.0
13     0.0
14     0.0
15     0.0
16     0.0
17     0.0
18     0.0
19     0.0
20     0.0
dtype: float64

如何运作

  • stack会在转换为系列时自动删除NaN值。
  • 现在,如果我们按新多指数的第一级分组,则位置-1是每个组中的最后一个值
  • 因此,我们使用lambda并计算每个事物的平均值,直到最后一个值x.iloc[:-1].mean()
  • 并从上一个值x.iloc[-1]
  • 中减去该值

答案 1 :(得分:2)

#use pandas apply to take the mean for the first n-1 stages and subtract from last stage.
df.apply(lambda x: x.iloc[x.number_of_stages]-np.mean(x.iloc[1:x.number_of_stages]),axis=1).fillna(0)
Out[264]: 
0      0.0
1      4.0
2      1.0
3      4.0
4     -4.0
5     -2.0
6     -2.0
7     15.0
8      1.5
9    -13.0
10   -10.5
11     0.0
12     0.0
13     0.0
14     0.0
15     0.0
16     0.0
17     0.0
18     0.0
19     0.0
20     0.0
dtype: float64

答案 2 :(得分:0)

  

按照之前所有阶段的平均值减去

这不是什么大问题,但我只是好奇!与你想要的输出不同,但与你的描述不同,如果其中一个赛车手只完成了一场比赛,他们的结果不应该是inf或nan而不是0吗? (从已经完成2~3场比赛的人那里指定他们,但最后一场比赛的结果与比赛的平均值完全相同?比如赛车#1对赛车#11~20)

df_sp = df.filter(regex='^stage\d+.*')
df['last'] = df_sp.T.fillna(method='ffill').T.iloc[:, -1]
df['mean'] = (df_sp.sum(axis=1) - df['last']) / (df['number_of_stages'] - 1)
print(df['last'] - df['mean'])

0      0.0
1      4.0
2      1.0
3      4.0
4     -4.0
5     -2.0
6     -2.0
7     15.0
8      1.5
9    -13.0
10   -10.5
11     NaN
12     NaN
13     NaN
14     NaN
15     NaN
16     NaN
17     NaN
18     NaN
19     NaN
20     NaN