Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-替换派生计算中的行值_Python_Python 3.x_Pandas - Fatal编程技术网

Python Pandas-替换派生计算中的行值

Python Pandas-替换派生计算中的行值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我需要根据行索引值进行in place值替换。替换值是一个切片(行和列)数据帧计算 设置 In [1]: import pandas as pd In [2]: cols = [0, 1, 'A0', 'A1', 'A2', 'A3', 'B0', 'B1', 'B2', 'B3']

我需要根据行索引值进行
in place
值替换。替换值是一个切片(行和列)数据帧计算

设置

In [1]: import pandas as pd                                                                                                  

In [2]: cols = [0, 1, 'A0', 'A1', 'A2', 'A3', 'B0', 'B1', 'B2', 'B3']                                                        

In [3]: data = [['sum', 4531.0010, 0, 0, 0, 2, 0, 0, 0, 7], 
   ...:         ['', 4531.0010, 5, 6, 3, 0, 5, 4, 7, 0], 
   ...:         ['', 4531.0010, 1, 3, 9, 0, 2, 2, 3, 0], 
   ...:         ['sum', 5037.0022, 0, 0, 0, 8, 0, 0, 0, 5], 
   ...:         ['', 5037.0022, 2, 2, 3, 0, 1, 3, 9, 0], 
   ...:         ['', 5037.0022, 5, 4, 7, 0, 5, 6, 3, 0]]                                                                     

In [4]: df = pd.DataFrame(data=data, columns=cols)                                                                           

In [5]: df = df.set_index(list(df.columns[[0, 1]]))                                                                          

In [6]: df                                                                                                                   
Out[6]: 
               A0  A1  A2  A3  B0  B1  B2  B3
0   1                                        
sum 4531.0010   0   0   0   2   0   0   0   7
    4531.0010   5   6   3   0   5   4   7   0
    4531.0010   1   3   9   0   2   2   3   0
sum 5037.0022   0   0   0   8   0   0   0   5
    5037.0022   2   2   3   0   1   3   9   0
    5037.0022   5   4   7   0   5   6   3   0
如您所见,行是多索引的,index=1是表示数据子集的数字。在每个数据子集中,索引=0中有一个“和”,我想向上(或向下)分配到零余额

计算基本上是将“A”列和索引1行中具有相同值的行相加为分母。然后,该数据组的行总和就是分子。然后,比率用于在行之间分配总和

对于行=4531.0010和带A的列,其计算公式为:

(5+6+3)/(5+6+3+1+3+9)*2=第1行第A3列
(1+3+9)/(5+6+3+1+3+9)*2=第2行第A3列

生成的
df
如下所示:

Out[7]: 
               A0  A1  A2     A3  B0  B1  B2     B3
0   1                                              
sum 4531.0010   0   0   0  2.000   0   0   0  7.000
    4531.0010   5   6   3  1.037   5   4   7  4.870
    4531.0010   1   3   9  0.923   2   2   3  2.130
sum 5037.0022   0   0   0  8.000   0   0   0  5.000
    5037.0022   2   2   3  2.435   1   3   9  2.407
    5037.0022   5   4   7  5.565   5   6   3  2.593
行数不是固定的-可能有一行,也可能有10行

我尝试过的

我尝试过使用
.pivot\u table()
的变体,但我不知道如何使用除法来逆转这个过程。作为一个整体

我还使用了
.sum()
的变体,但试图使用切片来约束
df
却让我不知所措。其中之一


我想我可以用很多python函数来实现这一点,但似乎应该可以更有效地实现这一点。任何方向都非常感谢

解决方案有效,如果
多索引的第一级唯一:

cols = [0, 1, 'A0', 'A1', 'A2', 'A3', 'B0', 'B1', 'B2', 'B3']

data = [['sum1', 4531.0010, 0, 0, 0, 2, 0, 0, 0, 7], 
        ['sum1', 4531.0010, 5, 6, 3, 0, 5, 4, 7, 0], 
        ['sum1', 4531.0010, 1, 3, 9, 0, 2, 2, 3, 0], 
        ['sum2', 5037.0022, 0, 0, 0, 8, 0, 0, 0, 5], 
        ['sum2', 5037.0022, 2, 2, 3, 0, 1, 3, 9, 0], 
        ['sum2', 5037.0022, 5, 4, 7, 0, 5, 6, 3, 0]]

df = pd.DataFrame(data=data, columns=cols)

df = df.set_index(list(df.columns[[0, 1]]))
print (df)
                A0  A1  A2  A3  B0  B1  B2  B3
0    1                                        
sum1 4531.0010   0   0   0   2   0   0   0   7
     4531.0010   5   6   3   0   5   4   7   0
     4531.0010   1   3   9   0   2   2   3   0
sum2 5037.0022   0   0   0   8   0   0   0   5
     5037.0022   2   2   3   0   1   3   9   0
     5037.0022   5   4   7   0   5   6   3   0


索引0不是唯一的--但是,如果我重置行索引并将索引0和1连接到新的列中,可能会产生相同的结果?@BillArmstrong-不确定在实际数据中如何区分,但如何区分组?您的数据样本是相似的还是唯一的?行索引实际上有5个深度-到目前为止,要复杂得多。但我可以根据你的答案简单地添加一个新的参考栏,而且效果很好。我想我可以让迭代器使用多索引深度并应用.unique(),只需一步就可以实现。谢谢
#loop by first letters of values in columns
for c in df.columns.str[0].unique():
    #filter values by first letter
    df1 = df.filter(like=c)
    #get sum per rows
    s = df1.iloc[:, :-1].sum(axis=1)
    #get last column
    last_col = df1.iloc[:, -1]
    #replace 0 in last column to previous non 0
    last_col = last_col.mask(last_col == 0).ffill()
    #divide by sum per first level with multiple by last_col
    s = s.div(s.sum(level=0), level=0).mul(last_col)
    #add to last column
    df[last_col.name] += s
print (df)
                A0  A1  A2        A3  B0  B1  B2        B3
0    1                                                    
sum1 4531.0010   0   0   0  2.000000   0   0   0  7.000000
     4531.0010   5   6   3  1.037037   5   4   7  4.869565
     4531.0010   1   3   9  0.962963   2   2   3  2.130435
sum2 5037.0022   0   0   0  8.000000   0   0   0  5.000000
     5037.0022   2   2   3  2.434783   1   3   9  2.407407
     5037.0022   5   4   7  5.565217   5   6   3  2.592593