2017-10-18 120 views
0

我有一个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) 

回答

1

选项1
使用,以便乘以提供axis参数指定所需的系列中,您都乘以成为pd.DataFrame.mul方法沿指数排列。

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 
+0

最后一件事是'Slim'因素。 – dirtysocks45

+0

除了'INT',数字都是正确的。对于int,如果它是'NO',我想要该行中其他元素的和的否定。否则,我希望它是行的正面总和。 – dirtysocks45

+0

我举了一个我需要的例子。 – dirtysocks45