我有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
答案 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()
会起作用