如何将两个数据帧转换为另一个?

时间:2017-10-18 02:46:53

标签: pandas indexing vectorization

我有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 个答案:

答案 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