在新数据框中对多行进行分组

我是一个在 2.7 版上工作的 python 新手。以下是我正在使用的数据框示例。还有其他与问题无关的列,因此它们不包含在下面。


df = pd.DataFrame( { "Name" : ["BROD", "BROD", "BROD", "BROD", "SSBD" , "SSBD","SSBD","SSBD"] , 

                     "Digit" : ["F", "F", "T", "T", "F", "F", "T", "T"],

                     "ID": ["A","A","A","A","B","B","B","B"],

                     "Date": ["2/3/2010","2/3/2010","2/3/2010","2/3/2010","3/4/2007","3/4/2007","3/4/2007","3/4/2007"],

                     "Base" : ["CAD","CAD","CAD","CAD","CAD","CAD","CAD","CAD"],

                     "Term" : ["USD","USD","JPY","JPY","EUR","EUR","JPY","JPY"],

                     "Amt": [100.00,100.00,9082.00,9082.00,60.00,60.00,7387.80,7387.80]})

有多个重复值。每行代表交易的一个组成部分,ID 列将它们分组为一个交易。我想创建一个新的数据框,每笔交易只包含一行。数据框如下所示:


ID    Date       Name     Buy   Sell    Buy Amt Sell Amt

A    2/3/2010    BROD     USD   JPY     100.00   9082.00

B    3/4/2007    SSBD     EUR   JPY     60.00    7387.80

对于每个 ID,如果 Digit = F,则 Term 列中的值位于 Buy 列中,Amt 列中的值位于 Buy Amt 列中。如果数字 = T,则 Term 列中的值位于 Sell 列中,Amt 列中的值位于 Sell Amount 列中。


请为我指出正确的方向,以最有效的方式解决这个问题。谢谢。


不负相思意
浏览 129回答 2
2回答

RISEBY

你可以使用np.where然后groupbydf['Buy'] = np.where((df['Digit'] == 'F'), df['Term'], np.nan)df['Sell'] = np.where((df['Digit'] == 'T'), df['Term'], np.nan)df['BuyAmt'] = np.where((df['Digit'] == 'F'), df['Amt'], np.nan)df['SellAmt'] = np.where((df['Digit'] == 'T'), df['Amt'], np.nan)df.drop(['Digit','Base','Term','Amt'], axis=1, inplace= True)df = df.groupby('ID').first()print(df)    Name      Date  Buy Sell  BuyAmt  SellAmtID                                           A   BROD  2/3/2010  USD  JPY   100.0   9082.0B   SSBD  3/4/2007  EUR  JPY    60.0   7387.8此外,如果您需要像您发布的那样按顺序排列您的专栏,您可以使用 pandas reindex

达令说

我认为应该删除重复项,否则您需要更好地解释如何处理相同的行:>>> df2 = df.drop_duplicates().reset_index(drop=True)然后我们创建两个数据框,一个用于“F”,一个用于“T”,为每个创建Buy/Sell和Buy Amt/ Sell Amt,并删除未使用的列:>>> df_F = df2[df2.Digit == 'F'].assign(**{'Buy': lambda x: x.Term, 'Buy Amt': lambda x: x.Amt})...                             .drop(['Digit', 'Base', 'Term', 'Amt'], axis=1)>>> df_T = df2[df2.Digit == 'T'].assign(**{'Sell': lambda x: x.Term, 'Sell Amt': lambda x: x.Amt})...                             .drop(['Digit', 'Base', 'Term', 'Amt'], axis=1)最后,我们合并两个数据框,并重新排列列顺序:>>> merged = df_F.merge(df_T, on=['ID', 'Name', 'Date'])>>> merged[['ID', 'Date', 'Name', 'Buy', 'Sell', 'Buy Amt', 'Sell Amt']]  ID      Date  Name  Buy Sell  Buy Amt  Sell Amt0  A  2/3/2010  BROD  USD  JPY    100.0    9082.01  B  3/4/2007  SSBD  EUR  JPY     60.0    7387.8就是这样。如果“ID”应该是索引,则可以使用merged.set_index('ID')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python