首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对新数据帧中的多行进行分组

对新数据帧中的多行进行分组
EN

Stack Overflow用户
提问于 2018-09-12 19:52:08
回答 2查看 859关注 0票数 1

我是一个负责2.7版本的python新手。下面是我正在使用的数据框架的示例。还有一些与问题无关的额外列,因此这些列不包括在下面。

代码语言:javascript
复制
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列将它们分组为一个交易。我想要创建一个新的数据框架,其中只包括一个交易一行。数据框架如下所示:

代码语言:javascript
复制
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,如果数字=F,则术语列中的值放在Buy列中,Amt列中的值放置在Buy列中。如果数字=T,则术语列中的值放置在Sell列中,Amt列中的值放在Sell列中。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-12 20:05:25

您可以使用np.where,然后使用groupby

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-09-12 21:49:37

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

代码语言:javascript
复制
>>> df2 = df.drop_duplicates().reset_index(drop=True)

然后,我们创建两个数据格式,一个用于'F‘,一个用于'T',为每个数据创建Buy/SellBuy Amt/Sell Amt,并删除未使用的列:

代码语言:javascript
复制
>>> 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)

最后,我们合并这两个数据格式,并重新排列列顺序:

代码语言:javascript
复制
>>> 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')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52302465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档