为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2021-06-10 16:45:59
我是一个在 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 AmtA    2/3/2010    BROD     USD   JPY     100.00   9082.00B    3/4/2007    SSBD     EUR   JPY     60.00    7387.80对于每个 ID,如果 Digit = F,则 Term 列中的值位于 Buy 列中,Amt 列中的值位于 Buy Amt 列中。如果数字 = T,则 Term 列中的值位于 Sell 列中,Amt 列中的值位于 Sell Amount 列中。请为我指出正确的方向,以最有效的方式解决这个问题。谢谢。
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

你可以使用np.where然后groupby


df['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  SellAmt

ID                                           

A   BROD  2/3/2010  USD  JPY   100.0   9082.0

B   SSBD  3/4/2007  EUR  JPY    60.0   7387.8

此外,如果您需要像您发布的那样按顺序排列您的专栏,您可以使用 pandas reindex


查看完整回答
反对 回复 2021-06-16
?
达令说

TA贡献1821条经验 获得超6个赞

我认为应该删除重复项,否则您需要更好地解释如何处理相同的行:


>>> 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 Amt

0  A  2/3/2010  BROD  USD  JPY    100.0    9082.0

1  B  3/4/2007  SSBD  EUR  JPY     60.0    7387.8

就是这样。如果“ID”应该是索引,则可以使用merged.set_index('ID')


查看完整回答
反对 回复 2021-06-16
  • 2 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信