将一个数据帧除以另一列

时间:2018-08-16 20:19:31

标签: python pandas numpy dataframe

我有两个数据框:

df1:
      Produtos       Jan       Feb       Mar       Apr       May       Jun  \
0          100   15884.0    8194.0   41070.0    8294.0   17308.0   18146.0   
1        10057       0.0       0.0       0.0   24900.0       0.0       0.0   
2        10058       0.0       0.0       0.0   30900.0       0.0       0.0   
3        10236   11638.0    8450.0    1690.0    3380.0   10140.0    1690.0   
4        10267       0.0       0.0       0.0   11490.0       0.0       0.0   
5        10273   18157.0   32434.0    4900.0       0.0   10588.0   15094.0 


df2:
      Produtos     Jan     Feb     Mar     Apr     May     Jun     Jul     Aug
0          100   600.0   200.0  1100.0   300.0   500.0  1600.0     0.0     0.0
1        10057     0.0     0.0     0.0   100.0     0.0     0.0     0.0     0.0
2        10058     0.0     0.0     0.0   100.0     0.0     0.0     0.0     0.0
3        10236   700.0   500.0   100.0   200.0   600.0   100.0   200.0   100.0
4        10267     0.0     0.0     0.0   100.0     0.0     0.0     0.0     0.0
5        10273   400.0   700.0   100.0     0.0   200.0   300.0   300.0   300.0

我试图将一个数据帧除以另一个,以便创建一个新的数据帧。但是,如果不考虑第一列“ Produtos”,我不知道如何进行这种划分。

这样做:

v = df1.values / df2.values

我也将第一列分开。

3 个答案:

答案 0 :(得分:1)

您将面临除以0的问题,得出NaN的值,但是假设Produtos列相等(因为它们在您的问题中),则可以将该列设置为索引,然后使用.div

df1.set_index('Produtos').div(df2.set_index('Produtos'))

                 Apr  Aug        Feb        Jan  Jul        Jun        Mar  \
Produtos                                                                     
100        27.646667  NaN  40.970000  26.473333  NaN  11.341250  37.336364   
10057     249.000000  NaN        NaN        NaN  NaN        NaN        NaN   
10058     309.000000  NaN        NaN        NaN  NaN        NaN        NaN   
10236      16.900000  NaN  16.900000  16.625714  NaN  16.900000  16.900000   
10267     114.900000  NaN        NaN        NaN  NaN        NaN        NaN   
10273            NaN  NaN  46.334286  45.392500  NaN  50.313333  49.000000   

             May  
Produtos          
100       34.616  
10057        NaN  
10058        NaN  
10236     16.900  
10267        NaN  
10273     52.940  

如果它们并不总是相等,而您只想除以相应的索引号,请使用drop('Produtos',1)

>>> df1.drop('Produtos',1).div(df2.drop('Produtos',1))
          Apr  Aug        Feb        Jan  Jul        Jun        Mar     May
0   27.646667  NaN  40.970000  26.473333  NaN  11.341250  37.336364  34.616
1  249.000000  NaN        NaN        NaN  NaN        NaN        NaN     NaN
2  309.000000  NaN        NaN        NaN  NaN        NaN        NaN     NaN
3   16.900000  NaN  16.900000  16.625714  NaN  16.900000  16.900000  16.900
4  114.900000  NaN        NaN        NaN  NaN        NaN        NaN     NaN
5         NaN  NaN  46.334286  45.392500  NaN  50.313333  49.000000  52.940

答案 1 :(得分:1)

您可以使用iloc忽略每个数据框中的第一列并划分结果。

>>> df1.iloc[:, 1:].div(df2.iloc[:, 1:])[df1.columns[1:]]

         Jan        Feb        Mar         Apr     May        Jun
0  26.473333  40.970000  37.336364   27.646667  34.616  11.341250
1        NaN        NaN        NaN  249.000000     NaN        NaN
2        NaN        NaN        NaN  309.000000     NaN        NaN
3  16.625714  16.900000  16.900000   16.900000  16.900  16.900000
4        NaN        NaN        NaN  114.900000     NaN        NaN
5  45.392500  46.334286  49.000000         NaN  52.940  50.313333

答案 2 :(得分:1)

如果您知道数据框形状和<div class="box"> Two div elements with borders. </div>系列是对齐的,则可以这样使用NumPy:

Produtos