![](/img/trans.png)
[英]Pandas: Accessing multiple columns under different top level column index in Multi-index columns Dataframe
[英]Pandas - How to scale a column in a multi-index dataframe to the top row in each level=0 group
我有一個多索引數據幀dfu
:
open high low close
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.030
09:48:00 25.90 25.90 25.760 25.760
09:51:00 26.00 26.00 25.985 25.985
2016-11-29 09:30:00 24.98 24.98 24.98 24.9800
09:33:00 25.00 25.00 24.99 24.9900
09:35:00 25.33 25.46 25.33 25.4147
我想創建一個新列,['closeScaled'],通過執行函數foo計算,使用['open']列中當前level = 0值的第一行和當前行['close ']作為參數。 我懷疑解決方案會涉及到以下內容:
dfu['closeScaled']=dfu.apply(lambda x: foo(*get first row of current date*[0],x[3]))
我似乎無法弄清楚當前級別= 0部分的第一行 。
如果foo
是:
def foo(firstOpen,currentClose):
return (currentClose / firstOpen)
那么我希望closeScaled
列包含(截斷到4位小數):
open high low close closeScaled
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.030 1.0000
09:48:00 25.90 25.90 25.760 25.760 0.9896
09:51:00 26.00 26.00 25.985 25.985 0.9982
2016-11-29 09:30:00 24.98 24.98 24.98 24.9800 1.0000
09:33:00 25.00 25.00 24.99 24.9900 1.0004
09:35:00 25.33 25.46 25.33 25.4147 1.0174
您可以使用groupby
創建的div
Series
除以transform
first
round
和最后round
:
print (dfu.groupby(level=0)['open'].transform('first'))
Date Time
2016-11-28 09:43:00 26.03
09:48:00 26.03
09:51:00 26.03
2016-11-29 09:30:00 24.98
09:33:00 24.98
09:35:00 24.98
Name: open, dtype: float64
dfu['closeScaled'] = dfu.close.div(dfu.groupby(level=0)['open'].transform('first')).round(4)
print (dfu)
open high low close closeScaled
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.0300 1.0000
09:48:00 25.90 25.90 25.760 25.7600 0.9896
09:51:00 26.00 26.00 25.985 25.9850 0.9983
2016-11-29 09:30:00 24.98 24.98 24.980 24.9800 1.0000
09:33:00 25.00 25.00 24.990 24.9900 1.0004
09:35:00 25.33 25.46 25.330 25.4147 1.0174
如果需要將浮點值截斷為4位小數:
第一個倍數為10000
,轉換為int
並除以10000
。
dfu['closeScaled'] = dfu.close.div(dfu.groupby(level=0)['open'].transform('first'))
.mul(10000).astype(int).div(10000)
print (dfu)
open high low close closeScaled
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.0300 1.0000
09:48:00 25.90 25.90 25.760 25.7600 0.9896
09:51:00 26.00 26.00 25.985 25.9850 0.9982
2016-11-29 09:30:00 24.98 24.98 24.980 24.9800 1.0000
09:33:00 25.00 25.00 24.990 24.9900 1.0004
09:35:00 25.33 25.46 25.330 25.4147 1.0174
#http://stackoverflow.com/a/783927/2901002
def truncate(f, n):
'''Truncates/pads a float f to n decimal places without rounding'''
s = '{}'.format(f)
if 'e' in s or 'E' in s:
return '{0:.{1}f}'.format(f, n)
i, p, d = s.partition('.')
return '.'.join([i, (d+'0'*n)[:n]])
dfu['closeScaled'] = dfu.close.div(dfu.groupby(level=0)['open'].transform('first'))
.apply(lambda x: truncate(x,4)).astype(float)
print (dfu)
open high low close closeScaled
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.0300 1.0000
09:48:00 25.90 25.90 25.760 25.7600 0.9896
09:51:00 26.00 26.00 25.985 25.9850 0.9982
2016-11-29 09:30:00 24.98 24.98 24.980 24.9800 1.0000
09:33:00 25.00 25.00 24.990 24.9900 1.0004
09:35:00 25.33 25.46 25.330 25.4147 1.0174
使用groupby
+ apply
+ lambda
df.groupby(level=0).apply(
lambda df: df.assign(closeScaled=df.close.div(df.open.iloc[0]).round(4))
)
open high low close closeScaled
Date Time
2016-11-28 09:43:00 26.03 26.03 26.030 26.0300 1.0000
09:48:00 25.90 25.90 25.760 25.7600 0.9896
09:51:00 26.00 26.00 25.985 25.9850 0.9983
2016-11-29 09:30:00 24.98 24.98 24.980 24.9800 1.0000
09:33:00 25.00 25.00 24.990 24.9900 1.0004
09:35:00 25.33 25.46 25.330 25.4147 1.0174
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.