2017-10-18 121 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