Python-pandas.Dataframe:按掩码将行按行给定的列除以值

时间:2019-03-12 23:47:40

标签: python pandas dataframe

TL; DR

考虑以下pd.Dataframe:

   a0  d2  b3   t4 
0   1   2   3  0.8 
1   3   4   3  9.0 
2   5   6   5  2.5 
3   7   7   7  8.0

我想按行将掩码cols = ['a0', 'd2', 'b3']指定的列(按行中的元素,例如a0)划分。以下代码可产生所需的结果:

# just to surpress pandas chain-assignment warning
pd.options.mode.chained_assignment = None

d = pd.DataFrame([[1,2,3,.8], [3,4,3,9], [5,6,5,2.5], [7,7,7,8]],columns=["a0", "d2", "b3", "t4"])

# mask
cols = ['a0', 'd2', 'b3']

for i, row in d.iterrows():
    a0 = float(row["a0"])
    for k, v in row.iteritems():
        if k in cols:
            d[k][i] /= a0 

输出:

   a0  d2  b3   t4 
0   1   2   3  0.8 
1   1   1   1  9.0 
2   1   1   1  2.5 
3   1   1   1  8.0

问题

我的问题是,是否有更复杂的方法来执行上述代码?我在想类似

的表达式
d.loc[:, cols] /= d.ix[:, ['a0']],

我认为几乎可以胜任工作,但是给我各部门的NaN:

    a0  d2  b3   t4 
0  1.0 NaN NaN  0.8 
1  1.0 NaN NaN  9.0 
2  1.0 NaN NaN  2.5 
3  1.0 NaN NaN  8.0

任何人都可以给我一个有关如何更正/替换最后一个表达式的提示。它按说明工作(并执行浮点除法)?该解决方案应该足够通用,以使用大小约为500的掩码,因为a-priori并不知道列名,而是使用reg-expressions生成它们。

1 个答案:

答案 0 :(得分:0)

尝试:

Source Cell Range