对一行中的值执行计算,并用该值更新另一行的列

时间:2019-05-21 13:15:32

标签: python-3.x pandas

我有一个看起来像这样的数据框:

Categor_1   Categor_2   Numeric_1   Numeric_2   Numeric_3  Numeric_col4   Month

ABC         XYZ          3523        454         4354       565      2018-02      
ABC         XYZ          333         444         123        565      2018-03 
qww         ggg          3222        568         123        483976      2018-03      

我想对具有条件的列应用一些简单的数学运算,并将其分配给另一行。

例如 如果为Month == 2018-03 & Categor_2 == 'XYZ',请执行Numeric_3*2,然后在2018-02个月将其分配给Numeric_3

所以输出将类似于:

Categor_1  Categor_2  Numeric_1  Numeric_2  Numeric_3_ Adj Numeric_col4  Month 

ABC         XYZ          3523        454         246       565      2018-02      
ABC         XYZ          333         444         123        565      2018-03 
qww         ggg          3222        568         123        483976      2018-03      

我正在考虑取出必要的列,然后做一个枢轴,应用数学,然后再次以原始方式重塑它。 但是,如果有一种快速的方法,不胜感激

1 个答案:

答案 0 :(得分:1)

这取决于过滤后的DataFrame系列的长度-这是一个元素系列,因此如果条件不匹配,则可以通过nextiter设置标量,以便可能添加默认值:

mask = (df.Month == '2018-03') & (df.Categor_2 == 'XYZ')

print (df.loc[mask, 'Numeric_3'] * 3)
1    369
Name: Numeric_3, dtype: int64

#get first value of Series, if emty Series is returned 0
a = next(iter(df.loc[mask, 'Numeric_3'] * 3), 0)
print (a)
369

df.loc[df.Month == '2018-02', 'Numeric_3'] = a
print (df)
  Categor_1 Categor_2  Numeric_1  Numeric_2  Numeric_3  Numeric_col4    Month
0       ABC       XYZ       3523        454        369           565  2018-02
1       ABC       XYZ        333        444        123           565  2018-03
2       qww       ggg       3222        568        123        483976  2018-03