Python 两个横截面上的简单算法返回所有NaN
我最初的问题是。这个解决方案对于滚动平均值,或者与移动值的差值都很有效 但如果将其应用于不同柱体的相同尺寸横截面的数学计算,它就不起作用了。它返回所有的值 我的假设是熊猫不高兴是因为列的名称不同,所以不能匹配它们进行减法?所以我应该做一些即时重命名(看起来很恶心),或者这是否意味着我错过了这个操作的一些更基本的东西Python 两个横截面上的简单算法返回所有NaN,python,pandas,Python,Pandas,我最初的问题是。这个解决方案对于滚动平均值,或者与移动值的差值都很有效 但如果将其应用于不同柱体的相同尺寸横截面的数学计算,它就不起作用了。它返回所有的值 我的假设是熊猫不高兴是因为列的名称不同,所以不能匹配它们进行减法?所以我应该做一些即时重命名(看起来很恶心),或者这是否意味着我错过了这个操作的一些更基本的东西 index = pd.DatetimeIndex(start='2018-1-1',periods=5,freq="M") persons = ['mike', 'dave', '
index = pd.DatetimeIndex(start='2018-1-1',periods=5,freq="M")
persons = ['mike', 'dave', 'matt']
measures = ['spin', 'drag', 'bezel']
cols = pd.MultiIndex.from_product([persons, measures],names=['human', 'measure'])
xf = pd.DataFrame(index=index, data=np.random.rand(5,9), columns=cols)
idx = pd.IndexSlice
#this shows that both cross sections have data
print(xf.xs('spin', axis=1, level=1, drop_level=False))
print(xf.xs('drag', axis=1, level=1, drop_level=False))
#this works fine.
zf = xf.xs('spin', axis=1, level=1, drop_level=False) - xf.xs('spin', axis=1, level=1, drop_level=False).shift(1)
#but this returns all NaN
qf = xf.xs('spin', axis=1, level=1, drop_level=False)+xf.xs('drag', axis=1, level=1, drop_level=False)
zf
问题是数据对齐-需要相同的
多索引值
,否则获取NaN
s:
print(xf.xs('spin', axis=1, level=1, drop_level=False))
human mike dave matt
measure spin spin spin
2018-01-31 0.248756 0.808523 0.885702
2018-02-28 0.150169 0.575710 0.468804
2018-03-31 0.723341 0.118158 0.360068
2018-04-30 0.857103 0.213594 0.533785
2018-05-31 0.288276 0.729455 0.153546
print(xf.xs('drag', axis=1, level=1, drop_level=False).rename(columns={'drag':'spin'}))
human mike dave matt
measure spin spin spin
2018-01-31 0.163067 0.625628 0.759117
2018-02-28 0.435679 0.146091 0.569999
2018-03-31 0.680671 0.242734 0.146042
2018-04-30 0.200212 0.973156 0.434459
2018-05-31 0.627167 0.556988 0.896226
qf = (xf.xs('spin', axis=1, level=1, drop_level=False)+
xf.xs('drag', axis=1, level=1, drop_level=False).rename(columns={'drag':'spin'}))
print (qf)
human mike dave matt
measure spin spin spin
2018-01-31 0.411823 1.434152 1.644819
2018-02-28 0.585849 0.721801 1.038803
2018-03-31 1.404011 0.360893 0.506110
2018-04-30 1.057316 1.186749 0.968244
2018-05-31 0.915443 1.286444 1.049771
因此,如果removedrop\u level=False
则列是相同的,但需要创建多索引:
np.random.seed(456)
index = pd.date_range(start='2018-1-1',periods=5,freq="M")
persons = ['mike', 'dave', 'matt']
measures = ['spin', 'drag', 'bezel']
cols = pd.MultiIndex.from_product([persons, measures],names=['human', 'measure'])
xf = pd.DataFrame(index=index, data=np.random.rand(5,9), columns=cols)
idx = pd.IndexSlice
#this shows that both cross sections have data
print(xf.xs('spin', axis=1, level=1))
human mike dave matt
2018-01-31 0.248756 0.808523 0.885702
2018-02-28 0.150169 0.575710 0.468804
2018-03-31 0.723341 0.118158 0.360068
2018-04-30 0.857103 0.213594 0.533785
2018-05-31 0.288276 0.729455 0.153546
print(xf.xs('drag', axis=1, level=1))
human mike dave matt
2018-01-31 0.163067 0.625628 0.759117
2018-02-28 0.435679 0.146091 0.569999
2018-03-31 0.680671 0.242734 0.146042
2018-04-30 0.200212 0.973156 0.434459
2018-05-31 0.627167 0.556988 0.896226
qf = xf.xs('spin', axis=1, level=1)+ xf.xs('drag', axis=1, level=1)
qf.columns = [qf.columns, ['new'] * len(qf.columns)]
print (qf)
human mike dave matt
new new new
2018-01-31 0.411823 1.434152 1.644819
2018-02-28 0.585849 0.721801 1.038803
2018-03-31 1.404011 0.360893 0.506110
2018-04-30 1.057316 1.186749 0.968244
2018-05-31 0.915443 1.286444 1.049771