python - 基于 DataFrame 中多索引的一级值替换值
问题描述
我有一个带有多索引的 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
以某种方式使用。
事先感谢您的帮助。
解决方案
您可以定义将单独处理每个组的自定义函数:
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)
推荐阅读
- mysql - 如何在 MySQL 中查找生成的列定义
- mysql - 将警告存储到文件 MySQL
- javascript - Javascript:如何在一个查找数组中匹配多个变量?
- javascript - 如何使用 Star Wars SWAPI API 从服务器搜索端点
- css - 文本下的边框和边框中的css文本
- javascript - 检查是否有任何对象为特定字段提供了值
- swift - 实例成员存储不能用于 StorageReference 类型
- java - SpringBoot,控制器通过ResponseBodyAdvice返回数据发生错误(class can't cast to string)
- unity3d - 统一:转换孩子的位置并将父母留在原处
- c# - VSTS 多个私有 NuGet 源