首页 > 解决方案 > 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) 

我认为我走在正确的道路上,但我就是想不通。任何帮助将不胜感激。

标签: pythonpandasdataframepivot

解决方案


为什么要尝试使用 groupby?pandas.pivot()为您分组。

您没有提供可重现的示例(提示:请下次再做),所以我编造了一些随机数据来解释可能的解决方案。请注意,这与您需要的不同,但它是一个起点:

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


推荐阅读