合并具有相同索引的行并为行da创建新列

2024-10-02 06:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个{}:

                Close
Symbol  Date    
AA  1/20/1998   29.530121
    1/14/2021   25.09
AIG 1/20/1998   485.831665
    1/14/2021   41.299999
AXP 1/20/1998   17.698372
... ... ...
WMT 1/14/2021   146.970001
XOM 1/20/1998   15.515985
    1/14/2021   50.310001

SymbolDate是索引。有些例外情况下,符号只有一个日期(本例中为WMT)

我想要这个:

    Start Date  End Date    Start Close End Close
Symbol              
AA  1/20/1998   1/14/2021   29.530121   25.09
AIG 1/20/1998   1/14/2021   485.831665  41.299999
AXP 1/20/1998   1/14/2021   17.698372   123.78
... ...         ...         ...         ...
VZ  1/20/1998   1/14/2021   14.96       57.040001
WMT 1/14/2021   Nan         146.970001  Nan
XOM 1/20/1998   1/14/2021   15.515985   50.310001

处理异常的其他方法(WMT)也可以。我只是设想第一次约会,并假设这是开始

我发现了this stack overflow post,它为类似的问题提供了透视表,但我无法对其进行调整。我试过这个:

test1 = df.reset_index()
pd.pivot_table(test1,index=['Symbol'],columns='Date',values='Close')

返回:

Date    1998-01-20  2021-01-14
Symbol      
AA  29.530121   25.090000
AIG 485.831665  41.299999
AXP 17.698372   123.779999
BA  27.150482   209.910004
... ...         ...

这将SymbolClose合并在同一行中,但不处理我试图处理的日期。从那以后,我一直在查看pd.pivot_table文档,但一直无法更进一步。你有什么建议吗


Tags: closedateindexnansymbolstartendaa
1条回答
网友
1楼 · 发布于 2024-10-02 06:21:52

获取样本数据并重置索引

df = df.reset_index()

Symbol  Date    Close
0   AA  1/20/1998   29.530121
1   AA  1/14/2021   25.090000
2   AIG 1/20/1998   485.831665
3   AIG 1/14/2021   41.299999
4   WMT 1/14/2021   146.970001
5   XOM 1/20/1998   15.515985
6   XOM 1/14/2021   50.310001

您可以按Symbol分组,并获取该组中的所有DateClose,然后创建一个包含两个日期和两个结束日期的序列,该序列将作为与符号对应的行

def func(df):
    dates = df['Date'].values.tolist()
    closes = df['Close'].values.tolist()
    if len(dates) == 1: # if there is one date,then End Date and End Close would be nans
        dates += [np.nan]
        closes += [np.nan]
    return pd.Series(dates + closes, index=['Start Date', 'End Date',
                                            'Start Close', 'End Close'])

df = df.groupby('Symbol')[['Date', 'Close']].apply(func)

df
    Start Date  End Date    Start Close End Close
Symbol              
AA  1/20/1998   1/14/2021   29.530121   25.090000
AIG 1/20/1998   1/14/2021   485.831665  41.299999
WMT 1/14/2021   NaN         146.970001  NaN
XOM 1/20/1998   1/14/2021   15.515985   50.310001

编辑:

有一种更简单的方法。可以使用unstack创建新列cumcount对组中的每个项目进行编号,用于知道每个组有多少行,以便相应地更新列

out_df = df.set_index(['Symbol', df.groupby('Symbol').cumcount()]).unstack()
out_df.columns = [f'Start {c1}' if c2 == 0 else f'End {c1}' for c1, c2 in out_df.columns]

相关问题 更多 >

    热门问题