通过应用涉及相同行元素的函数来更新数据框的元素

时间:2019-05-14 21:39:10

标签: python pandas

我有以下数据框:

a    b    c    d    e    f    g    h    i    j
1    2    3    4    5    6    7    8   0.1  0.11
11   12   13   14   15   16   17   18  0.2  0.12
21   22   23   24   25   26   27   28  0.3  0.13
31   32   33   34   35   36   37   38  0.4  0.14

我想读取EACH ROW,对于a到h列中的每个值(在该行中),减去i列中的值并除以j列中的值,然后用该结果值替换该原始值,并更新整个数据框(从a到h列)。

在这种情况下我应该如何进行?

6 个答案:

答案 0 :(得分:4)

您可以使用整形列ij并减去,

df = df.iloc[:, :8].sub(df['i'].values[:, None]).div(df['j'].values[:, None]).round(2)

    a       b       c       d       e       f       g       h
0   8.18    17.27   26.36   35.45   44.55   53.64   62.73   71.82
1   90.00   98.33   106.67  115.00  123.33  131.67  140.00  148.33
2   159.23  166.92  174.62  182.31  190.00  197.69  205.38  213.08
3   218.57  225.71  232.86  240.00  247.14  254.29  261.43  268.57

答案 1 :(得分:3)

使用filter和基础numpy数组。

u = df.filter(regex='[^ij]')

res = (u.values - df.i.values[:, None]) / df.j.values[:, None]

pd.DataFrame(res, columns=u.columns)

            a           b           c           d           e           f           g           h
0    8.181818   17.272727   26.363636   35.454545   44.545455   53.636364   62.727273   71.818182
1   90.000000   98.333333  106.666667  115.000000  123.333333  131.666667  140.000000  148.333333
2  159.230769  166.923077  174.615385  182.307692  190.000000  197.692308  205.384615  213.076923
3  218.571429  225.714286  232.857143  240.000000  247.142857  254.285714  261.428571  268.571429

答案 2 :(得分:3)

尝试将subdiv用于索引切片:

df.loc[:, 'a':'h'] = df.loc[:, 'a':'h'].sub(df['i'], axis=0).div(df['j'], axis=0)

输出:

            a           b           c           d           e           f  \
0    8.181818   17.272727   26.363636   35.454545   44.545455   53.636364   
1   90.000000   98.333333  106.666667  115.000000  123.333333  131.666667   
2  159.230769  166.923077  174.615385  182.307692  190.000000  197.692308   
3  218.571429  225.714286  232.857143  240.000000  247.142857  254.285714   

            g           h    i     j  
0   62.727273   71.818182  0.1  0.11  
1  140.000000  148.333333  0.2  0.12  
2  205.384615  213.076923  0.3  0.13  
3  261.428571  268.571429  0.4  0.14  

答案 3 :(得分:2)

这应该在您实际使用8 + 2列的情况下有效:

for col in df.columns[:8]:
    df[col]=(df[col]-df['i'])/df['h']

也许有一种更有效的方法,但这应该很容易理解

答案 4 :(得分:2)

有趣的方法eval:-)

pd.concat([df.eval('('+x +'-i)'+'/j') for x in df.columns[:8]],axis=1,keys=df.columns[:8]) 
Out[88]: 
            a           b           c  ...           f           g           h
0    8.181818   17.272727   26.363636  ...   53.636364   62.727273   71.818182
1   90.000000   98.333333  106.666667  ...  131.666667  140.000000  148.333333
2  159.230769  166.923077  174.615385  ...  197.692308  205.384615  213.076923
3  218.571429  225.714286  232.857143  ...  254.285714  261.428571  268.571429
[4 rows x 8 columns]

答案 5 :(得分:1)

这直接在numpy数组上进行操作

onRegionChangeComplete