我有一个带有多索引的DataFrame。级别为gender
,type
,最后是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
。
感谢您的帮助。
答案 0 :(得分:0)
您可以定义将分别处理每个组的自定义功能:
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)