用系列修改多索引的切片
Modify slice of multiindex with series
我有一个问题,一天中的大部分时间我都在努力解决这个问题,但到目前为止是徒劳的。
我想:
- 从多(列)索引中提取一个序列
- 用数学运算符或 .apply() 函数修改它
- return 它到数据框。
我可以执行 1 和 2,但由于某些原因我无法将其正确 return 到数据帧。我也很乐意根据该系列构建一个新的数据框。至此,我愿意做很多事情来解决它。
示例数据如下所示:
富
小节
巴兹
天
晚上
天
晚上
天
晚上
一个
一个
b
b
一个
一个
b
b
一个
一个
b
b
一个
一个
b
b
一个
一个
b
b
一个
一个
b
b
12
5
33
50
12
5
33
50
12
5
33
50
12
5
33
50
12
5
33
50
12
5
33
50
id
1
0
2
1
0
12
0
18
0
9
0
3
0
2
0
0
0
0
15
0
0
3
0
0
0
2
1
4
0
0
0
0
0
0
0
2
7
0
0
2
0
11
1
19
0
0
0
6
1
0
3
0
0
0
3
20
1
0
14
0
3
2
0
3
0
0
0
1
0
0
16
0
1
6
0
4
0
3
2
0
0
10
0
0
0
2
0
12
0
0
20
4
5
0
0
0
1
0
0
0
5
16
0
0
0
7
2
0
0
0
0
0
0
18
1
0
0
0
0
5
0
5
13
0
0
6
0
0
10
6
1
0
9
13
0
3
8
0
4
8
0
0
11
14
0
0
21
0
0
0
7
7
0
0
0
0
19
0
0
1
17
0
0
0
0
22
0
2
0
0
0
0
2
0
17
我可以通过以下变体获取数据:
in:
df.loc[2].loc['Foo','day']
out:
a 12 1
5 4
b 33 0
50 0
现在我想做一些事情:
df.loc[2].loc['Foo','day'] == df.loc[2].loc['Foo','day'] * (60*24)
并使用新数据更新数据框。就是为了后面的迭代编辑。但出于某种原因,没有任何改变我的数据框。我试过以我能想到的所有不同方式对其进行切片和更新。
我在这里尝试了 jezrael 对 jaydeepsb 的回答中的代码:Pandas update values in a multi-index dataframe
这让我不得不用一个值来更新一个切片,但到目前为止,我还无法用一个系列来更新一个切片。
如果有人能帮助我,我非常感谢你。也因为没有让我沮丧地把我的电脑扔出 window :D
(1) 找到数据框的子集,(2) 应用您的操作,(3) 更新您的数据框:
idx = pd.IndexSlice # for multi-index slicing
df.update(df.loc[[2], idx["Foo", "day", :, :]] * (60*24))
我有一个问题,一天中的大部分时间我都在努力解决这个问题,但到目前为止是徒劳的。
我想:
- 从多(列)索引中提取一个序列
- 用数学运算符或 .apply() 函数修改它
- return 它到数据框。
我可以执行 1 和 2,但由于某些原因我无法将其正确 return 到数据帧。我也很乐意根据该系列构建一个新的数据框。至此,我愿意做很多事情来解决它。
示例数据如下所示:
富 | 小节 | 巴兹 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
天 | 晚上 | 天 | 晚上 | 天 | 晚上 | |||||||||||||||||||
一个 | 一个 | b | b | 一个 | 一个 | b | b | 一个 | 一个 | b | b | 一个 | 一个 | b | b | 一个 | 一个 | b | b | 一个 | 一个 | b | b | |
12 | 5 | 33 | 50 | 12 | 5 | 33 | 50 | 12 | 5 | 33 | 50 | 12 | 5 | 33 | 50 | 12 | 5 | 33 | 50 | 12 | 5 | 33 | 50 | |
id | ||||||||||||||||||||||||
1 | 0 | 2 | 1 | 0 | 12 | 0 | 18 | 0 | 9 | 0 | 3 | 0 | 2 | 0 | 0 | 0 | 0 | 15 | 0 | 0 | 3 | 0 | 0 | 0 |
2 | 1 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 7 | 0 | 0 | 2 | 0 | 11 | 1 | 19 | 0 | 0 | 0 | 6 | 1 | 0 |
3 | 0 | 0 | 0 | 3 | 20 | 1 | 0 | 14 | 0 | 3 | 2 | 0 | 3 | 0 | 0 | 0 | 1 | 0 | 0 | 16 | 0 | 1 | 6 | 0 |
4 | 0 | 3 | 2 | 0 | 0 | 10 | 0 | 0 | 0 | 2 | 0 | 12 | 0 | 0 | 20 | 4 | 5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
5 | 16 | 0 | 0 | 0 | 7 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 18 | 1 | 0 | 0 | 0 | 0 | 5 | 0 | 5 | 13 | 0 | 0 |
6 | 0 | 0 | 10 | 6 | 1 | 0 | 9 | 13 | 0 | 3 | 8 | 0 | 4 | 8 | 0 | 0 | 11 | 14 | 0 | 0 | 21 | 0 | 0 | 0 |
7 | 7 | 0 | 0 | 0 | 0 | 19 | 0 | 0 | 1 | 17 | 0 | 0 | 0 | 0 | 22 | 0 | 2 | 0 | 0 | 0 | 0 | 2 | 0 | 17 |
我可以通过以下变体获取数据:
in:
df.loc[2].loc['Foo','day']
out:
a 12 1
5 4
b 33 0
50 0
现在我想做一些事情:
df.loc[2].loc['Foo','day'] == df.loc[2].loc['Foo','day'] * (60*24)
并使用新数据更新数据框。就是为了后面的迭代编辑。但出于某种原因,没有任何改变我的数据框。我试过以我能想到的所有不同方式对其进行切片和更新。
我在这里尝试了 jezrael 对 jaydeepsb 的回答中的代码:Pandas update values in a multi-index dataframe 这让我不得不用一个值来更新一个切片,但到目前为止,我还无法用一个系列来更新一个切片。
如果有人能帮助我,我非常感谢你。也因为没有让我沮丧地把我的电脑扔出 window :D
(1) 找到数据框的子集,(2) 应用您的操作,(3) 更新您的数据框:
idx = pd.IndexSlice # for multi-index slicing
df.update(df.loc[[2], idx["Foo", "day", :, :]] * (60*24))