将一个Pandas Dataframe划分为另一个 - 忽略索引但尊重列

时间:2015-05-19 13:42:05

标签: python pandas divide

我有2个数据帧。 我想播放分频操作

df1= pd.DataFrame([[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]],
                  columns=['A','B','C','D'], index=['x','y','z'])

df2= pd.DataFrame([[0.,1.,2.,3.]], columns=['A','B','D','C'], index=['q'])

请注意,df2中的列的对齐方式略有不同。

我想将df1除以df2,其中广播行但是列标签受到尊重。

   A   B   C   D
x  1   2   3   4
y  5   6   7   8
z  9  10  11  12


   A  B  D  C
q  0  1  2  3

这是错误的。

df1.values/df2.values

[[         inf   2.           1.5          1.33333333]
 [         inf   6.           3.5          2.66666667]
 [         inf  10.           5.5          4.        ]]

答案我的愿望是:

   A    B   C      D
x  inf  2   1      2
y  inf  6   2.33   4
z  inf  10  3.66   6

3 个答案:

答案 0 :(得分:4)

如果除以系列(通过选择第二个数据帧的一行),pandas会将此系列对齐第一个数据帧的列,从而得到所需的结果:

In [75]: df1 / df2.loc['q']
Out[75]:
     A   B         C  D
x  inf   2  1.000000  2
y  inf   6  2.333333  4
z  inf  10  3.666667  6

如果您不知道/想要使用该行的名称,可以使用squeeze将单列数据帧转换为系列:df1 / df2.squeeze()(请参阅@EdChum的答案) )。

答案 1 :(得分:1)

可能是,您可以订购与df2相同的df1列,然后除以值

In [53]: df1.values/df2[df1.columns].values
Out[53]:
array([[         inf,   2.        ,   1.        ,   2.        ],
       [         inf,   6.        ,   2.33333333,   4.        ],
       [         inf,  10.        ,   3.66666667,   6.        ]])

答案 2 :(得分:1)

您可以对列进行重新排序,然后调用squeeze以展平数组,然后调用div

In [114]:

df1= pd.DataFrame( [[1.,2.,3.,4.],[5.,6.,7.,8.],[9.,10.,11.,12.]] ,columns = ['A','B','C','D'], index = ['x','y','z'])
df2= pd.DataFrame( [[0.,1.,2.,3.]] ,columns = ['A','B','D','C'], index = ['q'])    ​
df1.div(df2.ix[:,df1.columns].squeeze())

Out[114]:
     A   B         C  D
x  inf   2  1.000000  2
y  inf   6  2.333333  4
z  inf  10  3.666667  6

df1/df2.ix[:,df1.columns].squeeze()也有效但@Joris的回答更好

修改

正如@joris指出的那样,列重新排序是不必要的,因为大熊猫无论如何都会自然地与列对齐:

df1.div(df2squeeze())

df1./df2squeeze()

会起作用