Pandas 基于其他列第 2 部分中的值从值中减去多索引
Pandas multi-index subtract from value based on value in other column part 2
基于对 的全面而准确的回复,我现在面临一个基于略有不同数据的新问题。
鉴于此数据框:
df = pd.DataFrame({
('A', 'a'): [23,3,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 possible
0 23 23 100
1 3 n/a 100
2 54 54 100
3 7 n/a 100
4 32 32 100
5 76 76 100
我想从每行 'possible' 中减去 4,对于该行的值为 'n/a' 的任何实例(列)(然后更改所有 'n/a'值为 0)。
A B possible
a b possible
0 23 23 100
1 3 n/a 96
2 54 54 100
3 7 n/a 96
4 32 32 100
5 76 76 100
一些条件:
可能会出现一列都是浮点数的情况(尽管经过检查它们似乎是整数)。这没有被纳入原始问题。
也可能出现一行包含两个 'n/a' 值的实例(列)。以前的解决方案解决了这个问题。
这是之前的解决方案:
idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -= (df.loc[:, idx[('A','B'),:]] == 'n/a').sum(axis=1) * 4
df.replace({'n/a':0}, inplace=True)
它有效,除了列(A 或 B)包含所有浮点数(看似整数)的地方。在这种情况下,会出现此错误:
TypeError: Could not compare ['n/a'] with block values
我认为您可以通过 astype
将转换添加到 string
到条件:
idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -=
(df.loc[:, idx[('A','B'),:]].astype(str) == '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 3 0 96
2 54 54 100
3 7 0 96
4 32 32 100
5 76 76 100
基于对
df = pd.DataFrame({
('A', 'a'): [23,3,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 possible
0 23 23 100
1 3 n/a 100
2 54 54 100
3 7 n/a 100
4 32 32 100
5 76 76 100
我想从每行 'possible' 中减去 4,对于该行的值为 'n/a' 的任何实例(列)(然后更改所有 'n/a'值为 0)。
A B possible
a b possible
0 23 23 100
1 3 n/a 96
2 54 54 100
3 7 n/a 96
4 32 32 100
5 76 76 100
一些条件: 可能会出现一列都是浮点数的情况(尽管经过检查它们似乎是整数)。这没有被纳入原始问题。
也可能出现一行包含两个 'n/a' 值的实例(列)。以前的解决方案解决了这个问题。
这是之前的解决方案:
idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -= (df.loc[:, idx[('A','B'),:]] == 'n/a').sum(axis=1) * 4
df.replace({'n/a':0}, inplace=True)
它有效,除了列(A 或 B)包含所有浮点数(看似整数)的地方。在这种情况下,会出现此错误:
TypeError: Could not compare ['n/a'] with block values
我认为您可以通过 astype
将转换添加到 string
到条件:
idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -=
(df.loc[:, idx[('A','B'),:]].astype(str) == '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 3 0 96
2 54 54 100
3 7 0 96
4 32 32 100
5 76 76 100