根据其他列

时间:2016-05-07 21:03:41

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

给出以下数据框:

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,这样列类型就是整数(但是float会这样做。)

提前致谢!

后续问题:

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

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 个答案:

答案 0 :(得分:2)

我认为您可以使用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

摘要4no4

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减去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)