给出以下数据框:
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)
答案 0 :(得分:2)
我认为您可以使用boolean indexing
按掩码检查值。上次replace
所有值n/a
至0
:
使用n/a
和sum
检查值值:
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
减去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)