pandas 对 Dataframe 中第二层中具有相同名称的列进行操作

km0tfn4u  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一个在列上有多个索引的dataframe:

df = pd.DataFrame({('a', 'status'): [0.1, 0.2, 0.3],
                   ('a', 'value'): [1.1, 1.2, 1.3],
                   ('b', 'status'): [0.1, 0.2, 0.3],
                   ('b', 'value'): [2.1, 2.2, 2.3],
                   ('c', 'status'): [0.1, 0.2, 0.3]})

我的目标是将所有value列乘以一个标量,或者将它们相加。我一直在努力寻找合适的表达式来使用直接索引或iloc,但似乎找不到正确的。以下是一些失败的尝试:

>>> df[(None, 'value')] += 2
...
KeyError: 2

>>> df.iloc[:, (None, 'value')] += 2
...
IndexingError: Too many indexers

我想这是可能的,虽然不是很优雅,使列的掩码或索引,所以我尝试:

>>> df.columns.levels[1] == 'value'
array([False,  True])

这对我所拥有的五个实际列没有帮助。

brvekthn

brvekthn1#

您需要 * 切片机 *:

df.loc[:, (slice(None), "value")] +=2

#another variant
# df.loc[:, pd.IndexSlice[:, "value"]] += 2

输出:

print(df)

       a            b            c
  status value status value status
0    0.1   3.1    0.1   4.1    0.1
1    0.2   3.2    0.2   4.2    0.2
2    0.3   3.3    0.3   4.3    0.3
goqiplq2

goqiplq22#

使用df.where()是一个选项:

m = df.columns.get_level_values(1) == 'value'

df.add(2).where([m]*df.shape[0],df)

输出:

a            b            c
  status value status value status
0    0.1   3.1    0.1   4.1    0.1
1    0.2   3.2    0.2   4.2    0.2
2    0.3   3.3    0.3   4.3    0.3

相关问题