首页 > 解决方案 > 基于 DataFrame 中多索引的一级值替换值

问题描述

我有一个带有多索引的 DataFrame。水平是gendertype最后age。我想用该组中的另一个年龄替换一个年龄的值。所以我猜我需要使用.groupby().

下面我举一个我遇到的问题的例子。

这是我最初拥有的 DataFrame:

Index    Gender    Type    Age    Value
0        'f'       'a'     0      'A1'
1        'f'       'a'     1      'A2'
2        'f'       'a'     2      'B1'
3        'f'       'a'     3      'xx'
4        'f'       'a'     4      'B5'
5        'f'       'a'     5      'F3'
6        'f'       'a'     6      'B6'
7        'f'       'a'     7      'Q10'
8        'f'       'a'     8      'A3'
9        'f'       'a'     9      'A1'
10       'f'       'b'     0      'D1'
11       'f'       'b'     1      'V2'
12       'f'       'b'     2      'V1'
13       'f'       'b'     3      'xx'
14       'f'       'b'     4      'G5'
15       'f'       'b'     5      'D3'
16       'f'       'b'     6      'B6'
17       'f'       'b'     7      'Q14'
18       'f'       'b'     8      'A3'
19       'm'       'a'     0      'A1'
20       'm'       'a'     1      'A2'
21       'm'       'a'     2      'B1'
21       'm'       'a'     3      'xx'
23       'm'       'a'     4      'B5'
24       'm'       'a'     5      'A3'
25       'm'       'a'     6      'B6'
26       'm'       'a'     7      'B15'
27       'm'       'a'     8      'A3'
28       'm'       'a'     9      'A1'
29       'm'       'b'     2      'V1'
30       'm'       'b'     3      'xx'
31       'm'       'b'     4      'R5'
32       'm'       'b'     5      'B3'
33       'm'       'b'     6      'W6'
34       'm'       'b'     7      'Q12'

可见,对于 的每一行age==3,值为xx。我希望将该值替换为每个性别类型组中 7 岁的值。

那是:

Index    Gender    Type    Age    Value
0        'f'       'a'     0      'A1'
1        'f'       'a'     1      'A2'
2        'f'       'a'     2      'B1'
3        'f'       'a'     3      'Q10'
4        'f'       'a'     4      'B5'
5        'f'       'a'     5      'F3'
6        'f'       'a'     6      'B6'
7        'f'       'a'     7      'Q10'
8        'f'       'a'     8      'A3'
9        'f'       'a'     9      'A1'
10       'f'       'b'     0      'D1'
11       'f'       'b'     1      'V2'
12       'f'       'b'     2      'V1'
13       'f'       'b'     3      'Q14'
14       'f'       'b'     4      'G5'
15       'f'       'b'     5      'D3'
16       'f'       'b'     6      'B6'
17       'f'       'b'     7      'Q14'
18       'f'       'b'     8      'A3'
19       'm'       'a'     0      'A1'
20       'm'       'a'     1      'A2'
21       'm'       'a'     2      'B1'
21       'm'       'a'     3      'B15'
23       'm'       'a'     4      'B5'
24       'm'       'a'     5      'A3'
25       'm'       'a'     6      'B6'
26       'm'       'a'     7      'B15'
27       'm'       'a'     8      'A3'
28       'm'       'a'     9      'A1'
29       'm'       'b'     2      'V1'
30       'm'       'b'     3      'Q12'
31       'm'       'b'     4      'R5'
32       'm'       'b'     5      'B3'
33       'm'       'b'     6      'W6'
34       'm'       'b'     7      'Q12'

请注意,DataFrame 是不平衡的,因为每个性别类型组内的年龄范围并不相同。它不会在同一年龄开始和结束,因此 3 岁不是每个组中的相同索引,我不能使用iloc,而是loc以某种方式使用。

事先感谢您的帮助。

标签: pythondataframe

解决方案


您可以定义将单独处理每个组的自定义函数:

def fix(g):
    g.loc[g['Age'] == 3, 'Value'] = g.loc[g['Age'] == 7, 'Value'].iloc[0]
    return g

df.groupby(['Gender', 'Type']).apply(fix)

推荐阅读