我有df1
看起来像:
Shady Slim Eminem
Date
2011-01-10 HI Yes 1500
2011-01-13 HI No 1500
2011-01-13 BYBY Yes 4000
2011-01-26 OKDO Yes 1000
我的df2
看起来像这样:
HI BYBY OKDO INT
Date
2011-01-10 340.99 143.41 614.21 1.0
2011-01-13 344.20 144.55 616.69 1.0
2011-01-13 344.20 144.55 616.69 1.0
2011-01-26 342.38 156.42 616.50 1.0
我想将Eminem
保存为系列。我还希望df2
中的每一列都是一个系列。我想将Eminem
乘以Shady
的右对应元素中的这些值,并填充df3
。
我想要一个看起来像
df3
我还希望INT
列是df3
中每行的总和。
我想以矢量化的方式来做这件事。
此外,根据SLIM
列,如果它是YES
,那么我想添加Eminem * value
其他我想要否定它。
以下是我想要的值:
HI BYBY OKDO INT
Date
2011-01-10 511,485 0 0 sum(row 1)
2011-01-13 -516300 578200 0 sum(row 2)
2011-01-13 0 578200 0 sum(row 3)
2011-01-26 0 0 616500 sum(row 4)
答案 0 :(得分:1)
选项1
使用pd.DataFrame.mul
方法进行乘法并提供axis
参数,以指定您希望所乘的系列在索引上排成一行。
df2.mul(df1.Eminem, axis=0)
HI BYBY OKDO SOME COOL INT
Date
2011-01-10 511485.0 215115.0 921315.0 108030.0 184785.0 1500.0
2011-01-13 516300.0 216825.0 925035.0 110310.0 186810.0 1500.0
2011-01-13 1376800.0 578200.0 2466760.0 294160.0 498160.0 4000.0
2011-01-26 342380.0 156420.0 616500.0 76370.0 125800.0 1000.0
选项2
如果偶然,您尝试乘以的系列已经按照您想要的方式排序,您可以放弃索引并访问values
属性。
df2.mul(df1.Eminem.values, 0)
HI BYBY OKDO SOME COOL INT
Date
2011-01-10 511485.0 215115.0 921315.0 108030.0 184785.0 1500.0
2011-01-13 516300.0 216825.0 925035.0 110310.0 186810.0 1500.0
2011-01-13 1376800.0 578200.0 2466760.0 294160.0 498160.0 4000.0
2011-01-26 342380.0 156420.0 616500.0 76370.0 125800.0 1000.0
选项3
如果索引证明很难,你可以添加一个使其唯一的级别
unique_me = lambda d: d.set_index(d.groupby(level=0).cumcount(), append=True)
df2.pipe(unique_me).mul(df1.pipe(unique_me).Eminem, axis=0).reset_index(-1, drop=True)
HI BYBY OKDO SOME COOL INT
Date
2011-01-10 511485.0 215115.0 921315.0 108030.0 184785.0 1500.0
2011-01-13 516300.0 216825.0 925035.0 110310.0 186810.0 1500.0
2011-01-13 1376800.0 578200.0 2466760.0 294160.0 498160.0 4000.0
2011-01-26 342380.0 156420.0 616500.0 76370.0 125800.0 1000.0
使用超薄因子
df2.drop('INT', axis=1, errors='ignore').mul(df1.Eminem.values, 0).assign(
INT=lambda d: (lambda s: s.mask(df1.Slim.eq('No'), -s))(d.sum(1)))
HI BYBY OKDO SOME COOL INT
Date
2011-01-10 511485.0 215115.0 921315.0 108030.0 184785.0 1940730.0
2011-01-13 516300.0 216825.0 925035.0 110310.0 186810.0 -1955280.0
2011-01-13 1376800.0 578200.0 2466760.0 294160.0 498160.0 5214080.0
2011-01-26 342380.0 156420.0 616500.0 76370.0 125800.0 1317470.0