2

我有一个像这样的数据框,我想使用 pandas 将行乘以其在另一个数据框中的引用值。之后,我想添加这些行中的所有产品并将其存储在名为 Pro_Sum 的列中。我知道 Python 不会通过引用传递东西,但我可以在这里进行名称绑定,所以我试图创建一个字典来根据其名称乘以值,但我没有成功。

df = pd.read_excel (C:/"dummy")
d = {"C1": 2, "C2": 5,"C3":4, "C4":1}
df.mul(pd.Series(d), axis=1)

prod = d.keys() 
df[prod] = df[prod].mul(pd.Series(d), axis=1)[prod]
to_sum_t = list(df)
#.sum ignores the none numeric values.
df['Pro_sum'] = df[to_sum_t].sum(axis=1)

输入

ID  AU  HP  Name1   Value1  CHC1    Name2 Value2 CHC2   Name3 Value3 CHC3 
1   4   3   C1        10    100      0      0       0     0      0      0       
2   6   2   C2        20    95      C1      6       5     0      0      0    
3   2   7   C3        4     40      C4      6       60    0      0      0   
4   8   9   C1        8     100      0      0       0     0      0      0    
5   2   6   C1        6     10      C2      15      86   C4      1      4    

参考专栏

Names Values
  C1    2
  C2    5
  C3    4
  C4    1
  Example row 5 Pro_Sum = 6*2 + 15*5 + 1*1 = 88

最小输出

ID  AU  HP  Name1 Value1 CHC1   Name2 Value2 CHC2   Name3 Value3 CHC3 Pro_Sum
1   4   3   C1      10    100      0    0     0       0      0      0    20 
2   6   2   C2      20    95      C1    6     5       0      0      0    112
5   2   6   C1       6    10      C2    15    86      C4     1      4    88
4

1 回答 1

1

我认为需要filter按名称的列,replace按字典的值,并通过values、多个、求和转换为 numpy 数组并分配给新列:

d = {"C1": 2, "C2": 5,"C3":4, "C4":1}

a = df.filter(like='Name').replace(d).astype(int).values
b = df.filter(like='Value').values

df['Pro_Sum'] = (a * b).sum(axis=1)
print (df)
   ID  AU  HP Name1  Value1  CHC1 Name2  Value2  CHC2 Name3  Value3  CHC3  \
0   1   4   3    C1      10   100     0       0     0     0       0     0   
1   2   6   2    C2      20    95    C1       6     5     0       0     0   
2   3   2   7    C3       4    40    C4       6    60     0       0     0   
3   4   8   9    C1       8   100     0       0     0     0       0     0   
4   5   2   6    C1       6    10    C2      15    86    C4       1     4   

   Pro_Sum  
0       20  
1      112  
2       22  
3       16  
4       88
于 2018-06-26T13:37:56.723 回答