如何解决Pandas:如何按数据框分组并将行转换为列并合并行
这是我的数据结构:
date_time ticker stock_price type bid ask impVol symbol strike_price delta vega gamma theta rho diff
371 2021-02-19 14:28:45 AMZN 3328.23 put 44.5 46.85 NaN AMZN210226P03330000 3330.0 NaN NaN NaN NaN NaN 1.77
370 2021-02-19 14:28:45 AMZN 3328.23 call 43.5 45.80 NaN AMZN210226C03330000 3330.0 NaN NaN NaN NaN NaN 1.77
1066 2021-02-19 14:28:55 AMZN 3328.23 call 43.5 45.80 NaN AMZN210226C03330000 3330.0 NaN NaN NaN NaN NaN 1.77
1067 2021-02-19 14:28:55 AMZN 3328.23 put 44.5 46.85 NaN AMZN210226P03330000 3330.0 NaN NaN NaN NaN NaN 1.77
我的目标是对 date_time 进行分组,然后为看跌期权的买入价和卖出价以及买入价和卖出价创建一列。
我的预期输出是这样的:
date_time ticker stock_price put_bid put_ask call_bid call_ask impVol symbol strike_price delta vega gamma theta rho diff
371 2021-02-19 14:28:45 AMZN 3328.23 44.5 46.85 43.5 45.80 NaN AMZN210226P03330000 3330.0 NaN NaN NaN NaN NaN 1.77
1066 2021-02-19 14:28:55 AMZN 3328.23 43.5 45.80 44.5 46.85 NaN AMZN210226C03330000 3330.0 NaN NaN NaN NaN NaN 1.77
我尝试了所有我能找到的例子,包括像这样的旋转:
df=pd.pivot_table(df,index=['date_time','type'],columns=df.groupby(['date_time','type']).cumcount().add(1),values=['market_price'],aggfunc='sum')
df.columns=df.columns.map('{0[0]}{0[1]}'.format)
我认为我走在正确的道路上,但我就是想不通。任何帮助将不胜感激。
解决方法
您为什么要尝试使用 groupby? pandas.pivot()
为您进行分组。
您尚未提供 reproducible example(提示:请下次再做),因此我编造了一些随机数据来解释可能的解决方案。请注意,这与您需要的不同,但它是一个起点:
import numpy as np
import pandas as pd
df = pd.DataFrame()
df['period'] = np.repeat([1,2],2)
df['product'] = 'kiwi'
df['type'] = np.tile(['buy','sell'],2)
df['price'] = np.arange(1,5)
out = pd.pivot_table(df,index =['period','product'],columns = ['type'],values ='price' )
您需要在左侧(索引)指定您想要的内容,在顶部(列)您想要什么以及您想要为该组合显示哪些值(值)。
另外,您确定日期时间相同吗?如果在前两行中它甚至只差一秒钟怎么办 - 这可能吗?如果表格第一行和第二行的股票价格不同怎么办?我不知道你的数据,所以不知道这是否可行,但需要考虑一下。
另请注意,我的示例未指定聚合函数,因此默认为均值。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html
,要使用数据透视表按照您描述的方式重新定向数据,您需要包括所有随类型而变化的列,在这种情况下包括“符号”(注意代码中的 P 与 C ):
In [10]: pivoted = df.pivot(
...: index=['date_time','ticker','stock_price','impVol','strike_price','delta','vega','gamma','theta','rho','diff'],...: columns=['type','symbol'],...: values=['bid','ask'],...: )
In [11]: pivoted
Out[11]:
bid ask
type put call put call
symbol AMZN210226P03330000 AMZN210226C03330000 AMZN210226P03330000 AMZN210226C03330000
date_time ticker stock_price impVol strike_price delta vega gamma theta rho diff
2021-02-19 14:28:45 AMZN 3328.23 NaN 3330.0 NaN NaN NaN NaN NaN 1.77 44.5 43.5 46.85 45.8
2021-02-19 14:28:55 AMZN 3328.23 NaN 3330.0 NaN NaN NaN NaN NaN 1.77 44.5 43.5 46.85 45.8
如果您愿意,可以重新标记您的列:
In [12]: pivoted.columns = pd.Index([i[0] + '_' + i[1] for i in pivoted.columns.values])
In [13]: pivoted
Out[13]:
bid_put bid_call ask_put ask_call
date_time ticker stock_price impVol strike_price delta vega gamma theta rho diff
2021-02-19 14:28:45 AMZN 3328.23 NaN 3330.0 NaN NaN NaN NaN NaN 1.77 44.5 43.5 46.85 45.8
2021-02-19 14:28:55 AMZN 3328.23 NaN 3330.0 NaN NaN NaN NaN NaN 1.77 44.5 43.5 46.85 45.8
或者,您可以只从索引中排除符号,但无论哪种方式,您都需要堆叠符号、删除它或以某种方式手动处理它,因为每种“类型”的数据都不相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。