我正在尝试弄清楚如何划分两个数据帧,而pd.DataFrame.div()和pd.DataFrame.mul()文档似乎并没有很好地为我解释所有事情。下面是MWE
import pandas as pd
import numpy as np
ref = pd.DataFrame({'key':['a','b','c','d','e','h','z'], 'Values1':[1,2,3,4,5,'NaN','NaN']})
sub = pd.DataFrame({'key':['a','b','z','e','c','a'], 'Values2':[20,40,'Nan',60,80,100]})
ref = ref.set_index('key').astype('float64')
sub = ref.set_index('key').astype('float64')
### Create some sample dataframes of same size w/ different values
test1 = pd.concat([ref.reindex(sub.index.tolist()), sub], axis=1).astype('float64')
test2 = pd.concat([sub,sub*3],axis=1
### Sample Computations
# 1) Divide test2 by test1, axis = 'index'
test2.div(test1, axis = 'index')
Values1 Values2 Values2
key
a NaN 1.0 0.333333
b NaN 1.0 0.333333
z NaN NaN NaN
e NaN 1.0 0.333333
c NaN 1.0 0.333333
a NaN 1.0 0.333333似乎正在发生的情况是,.div()方法获取test2的每一列,并将其除以test中同名的列。因此,.div()避免使用Values1列,然后对名称相似的列进行除法。我的目标是得到类似于下面的东西:
Values1 Values2
key
a 0.05 0.33
b 0.05 0.33
z NaN NaN
e 0.083 0.33
c 0.038 0.33
a 0.01 0.33 我实际上可以通过执行test1.values / test2.values获得我想要的值,但是我必须将这些值重新合并到一个数据帧中,这似乎效率很低,并且表明我在尝试使用.div()或.mul()时可能做错了什么。
因此,我希望有人能向我解释.div()方法在这种情况下是如何工作的,以及为什么我的结果不是我认为应该得到的结果。
发布于 2021-02-04 03:29:54
你的列是不一样的。这里的test2包含["Values2", "Values2"]列,而不是["Values1", "Values2"]列。请参见下面的固定列。还要注意你有一个打字错误,我做了标记。您也可以将2除以1,但您的预期输出是1除以2。
import pandas as pd
import numpy as np
ref = pd.DataFrame({'key':['a','b','c','d','e','h','z'], 'Values1':[1,2,3,4,5,'NaN','NaN']})
sub = pd.DataFrame({'key':['a','b','z','e','c','a'], 'Values2':[20,40,'Nan',60,80,100]})
ref = ref.set_index('key').astype('float64')
sub = sub.set_index('key').astype('float64') #fixed typo
### Create some sample dataframes of same size w/ different values
test1 = pd.concat([ref.reindex(sub.index.tolist()), sub], axis=1).astype('float64')
test2 = pd.concat([sub,sub*3],axis=1)
test2.columns=test1.columns #fix columns
### Sample Computations
# 1) Divide test2 by test1, axis = 'index'
print(test1)
print(test2)
print(test2.div(test1))
#showing axis:
print(test2.div([1,2], axis = 'columns'))
print(test2.div([1,2,3,4,5,6], axis = 'index'))https://stackoverflow.com/questions/66034294
复制相似问题