【问题标题】:Pandas multi-index subtract from value based on value in other columnPandas 多索引根据其他列中的值从值中减去
【发布时间】:2016-09-02 18:50:22
【问题描述】:

给定以下数据框:

df = pd.DataFrame({
    ('A', 'a'): [23, 'n/a',54,7,32,76],
    ('B', 'b'): [23, 'n/a',54,7,32,76],
    ('possible','possible'):[100,100,100,100,100,100]
    })
df
    A       B   possible
    a       b   
0   23      23      100
1   n/a     n/a     100
2   54      54      100
3   7       n/a     100
4   32      32      100
5   76      76      100

我想为每个“n/a”实例调整每行的“可能”,这样每个实例都会从“可能”中减去 4。 想要的结果如下:

    A       B   possible
    a       b   possible
0   23      23      100
1   n/a     n/a     92
2   54      54      100
3   7       n/a     96
4   32      32      100
5   76      76      100

然后,完成后,我希望将“n/a”的每个实例转换为 0,以便列类型为整数(但浮点数可以)。

提前致谢!

后续问题:

如果我的多索引是这样的:

df = pd.DataFrame({
        ('A', 'a'): [23, 'n/a',54,7,32,76],
        ('A', 'b'): [23, 'n/a',54,7,32,76],
        ('B', 'b'): [23, 'n/a',54,7,32,76],
        ('possible','possible'):[100,100,100,100,100,100]
        })

我有 5 个上层索引和 25 个下层索引。我想知道是否可以只引用

中的顶级
no4 = (df.loc[:, (top level indices),(bottom level indices)] == 'n/a').sum(axis=1) 

【问题讨论】:

  • 我认为索引1 是错字——不是92 而是96
  • 你好耶。实际上,它应该是 92,因为我想为给定行中出现的每个 'n/a' 减去 4。

标签: python-3.x pandas multi-index


【解决方案1】:

我认为您可以使用 boolean indexing 通过掩码检查值。最后replace所有值n/a0

使用n/asum 检查值:

idx = pd.IndexSlice
no4 = (df.loc[:, idx[('A', 'B'), ('a', 'b')]] == 'n/a').sum(axis=1) 
print no4
0    0
1    2
2    0
3    1
4    0
5    0
dtype: int64

检查总和是否等于0(这意味着有n/a 值):

mask = no4 != 0
print mask
0    False
1     True
2    False
3     True
4    False
5    False
dtype: bool

减去4乘以no4

df.loc[mask, idx['possible', 'possible']] -= no4 * 4
df.replace({'n/a':0}, inplace=True)
print df
    A   B possible
    a   b possible
0  23  23    100.0
1   0   0     92.0
2  54  54    100.0
3   7   0     96.0
4  32  32    100.0
5  76  76    100.0

编辑:

我找到了更简单的解决方案 - 不需要掩码,因为你减去 0 if n/a:

idx = pd.IndexSlice
print (df.loc[:, idx[('A', 'B'), ('a', 'b')]] == 'n/a').sum(axis=1) * 4
0    0
1    8
2    0
3    4
4    0
5    0
dtype: int64

df.loc[:, idx['possible', 'possible']] -= 
(df.loc[:, idx[('A', 'B'), ('a', 'b')]] == 'n/a').sum(axis=1) * 4
df.replace({'n/a':0}, inplace=True)
print df
    A   B possible
    a   b possible
0  23  23      100
1   0   0       92
2  54  54      100
3   7   0       96
4  32  32      100
5  76  76      100

EDIT1:如果您只需要选择汤姆索引 - 请参阅using slicers

(df.loc[:, idx[(top level indices),:]] == 'n/a').sum(axis=1) 

【讨论】:

  • 哇,谢谢你的解释!只有一件事:对于行中存在“n/a”的每一列,它应该减去 4。
  • n/a 是否可能仅在列 (A,a) 中而不在 (B,b) 中?
  • 它可能会以这种方式发生。这取决于给定时间的数据。每行和/或每列可能出现多个“n/a”。
  • 谢谢。总是在最后一列int?因为现在我得到了float
  • 它是浮动的。不需要int。
猜你喜欢
  • 2016-09-02
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多