如何在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