如何在Python中减去GROUPBY之后的行?

如何在Python中减去GROUPBY之后的行?,python,dataframe,Python,Dataframe,我有一个dataframe,在应用groupby().sum之后,我得到了这个结果 我拥有的 Market Type Amount A Buy 46.56 B Buy 100.00 Sell 100.00 C Buy 697.20 D Buy 100.00

我有一个
dataframe
,在应用
groupby().sum
之后,我得到了这个结果

我拥有的

Market     Type      Amount                                   
A          Buy        46.56
B          Buy       100.00
           Sell      100.00
C          Buy       697.20
D          Buy       100.00 <--
           Sell       40.00 <--
...        ...        ...
市场类型金额
A买46.56美元
B买100美元
卖出100.00
C买697.20

D买100.00我想这不是一种优化的方式,但你可以试试这个代码块

idx = df[df["Type"] == 'Sell'].index
df.loc[idx, 'Amount'] = df.loc[idx, 'Amount'] * (-1) 

df = df.groupby(['Market'], as_index=False).agg({'Type': 'min', 'Amount': 'sum'})
df = df.loc[~((df['Amount'] == 0))] 

您可以迭代df行:

import pandas as pd
new_data = []
data = [['A', 'Buy', 46.56], ['B', 'Buy', 100.00], ['','Sell', 100],
        ['C', 'Buy', 697.20], ['D', 'Buy', 100.00], ['','Sell', 40]]
df = pd.DataFrame(data, columns=['Market','Type','Amount'])
for index, row in df.iterrows():
    if row['Type'] == 'Buy' and df.iloc[index+1]['Type'] == 'Buy':
        new_data.append([row['Market'], row['Type'],row['Amount']])
    elif row['Type'] == 'Buy' and df.iloc[index + 1]['Type'] == 'Sell':
        if df.iloc[index]['Amount'] - df.iloc[index+1]['Amount']:
            new_data.append([row['Market'], row['Type'],
                             df.iloc[index]['Amount'] - df.iloc[index+1]['Amount']])

print(pd.DataFrame(new_data, columns = ['Market','Type','Amount']))
产出:

  Market Type  Amount
0      A  Buy   46.56
1      C  Buy  697.20
2      D  Buy   60.00

这里有另一种方法,我认为更“pythonic”:使用

首先重置索引,然后在“类型”列上应用透视,然后在列中获得买入/卖出金额,然后可以将其减去:

df=df.pivot(index='Market',columns='Type')
df=pd.DataFrame(df['Amount']['Buy']-df['Amount']['Sell'].fillna(0),列=['Buy']))
(使用
fillna(0)
确保在NA时减去0)

然后可以过滤掉0个值

df=df[df['Buy']>0]
这将使你:

           Buy
Market        
A        45.65
C       697.20
D        60.00


代码很好,但它给了我金额的总和。它使用groupbying Market返回金额(买入)-金额(卖出)的减法。我想这就是你在问题中所说的。我假设买入金额始终高于您声称的卖出金额。我需要
buy-sell
在groupby操作之前,我获取了卖出金额的-1倍。这意味着(buy+(-sell)),因此它与buy-sell是一样的:)我已经在你的答案中添加了
as_index=False
,以稳定列。
        Amount       
Type       Buy   Sell
Market               
A        45.65    NaN
B       100.00  100.0
C       697.20    NaN
D       100.00   40.0

           Buy
Market        
A        45.65
C       697.20
D        60.00