我正在尝试使用多个条件从pandas DataFrame中删除行。
标准是,如果Trader_x在同一天购买和出售,则删除该日期的买卖行。
这很复杂,因为它要求交易者和日期对于查找是唯一的。如果只有日期匹配买卖,我不想删除行。它必须是trader_x和日期相关的。
我尝试了许多方法,包括数据透视表和合并,但我无法接近工作。
输入数据如下所示:
Trader_ID Date Type
Trader_1 5/4/11 Sell
Trader_1 13/4/11 Sell
Trader_1 4/4/12 Sell
Trader_1 3/4/13 Sell
Trader_1 2/5/13 Sell
Trader_1 9/7/13 Sell
Trader_1 5/5/14 Buy
Trader_1 5/5/14 Sell
Trader_1 5/5/15 Buy
Trader_2 5/5/15 Sell
Trader_2 15/3/13 Buy
Trader_2 15/3/13 Sell
Trader_2 1/4/13 Buy
Trader_2 1/4/13 Sell
Trader_2 15/4/13 Buy
Trader_2 15/4/13 Sell
Trader_2 29/4/13 Buy
Trader_2 30/4/13 Sell
Trader_2 22/5/13 Sell
如果有人愿意尝试下面的示例DataFrame。
data = {'trader_id': ['Trader_1','Trader_1','Trader_1','Trader_1','Trader_1','Trader_1','Trader_1',
'Trader_1','Trader_1','Trader_2','Trader_2','Trader_2','Trader_2','Trader_2','Trader_2',
'Trader_2','Trader_2','Trader_2','Trader_2'],
'date': ['1/4/13', '13/4/11', '4/4/12', '3/4/13', '2/5/13', '9/7/13', '5/5/14', '5/5/14', '5/5/15',
'5/5/15', '15/3/13', '15/3/13', '1/4/13', '1/4/13', '15/4/13', '15/4/13', '29/4/13', '30/4/13', '22/5/13'],
'type': ['Sell', 'Sell', 'Sell', 'Sell', 'Sell', 'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Buy',
'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Sell']}
df = pd.DataFrame(data)
(示例)数据集的总输入为19行。输出应该只有11行。
输出数据应如下所示:
Trader_ID Date Type
Trader_1 5/4/11 Sell
Trader_1 13/4/11 Sell
Trader_1 4/4/12 Sell
Trader_1 3/4/13 Sell
Trader_1 2/5/13 Sell
Trader_1 9/7/13 Sell
Trader_1 5/5/15 Buy
Trader_2 5/5/15 Sell
Trader_2 29/4/13 Buy
Trader_2 30/4/13 Sell
Trader_2 22/5/13 Sell
会喜欢这方面的指导 - 我被困住了。感谢。
答案 0 :(得分:3)
如果交易者只包含一种交易类型,无论是购买还是卖,您的逻辑可以归结为保持交易日期,您可以使用{{1} }:
groupby.filter
请注意,使用的数据是字典中提供的数据,与代码块中的数据略有不同。
答案 1 :(得分:1)
似乎你从来没有一个交易者在一天内多次卖出或买入。因此,我们可以过滤等于1的交易数量
df.groupby(['trader_id', 'date']).filter(lambda x: len(x) == 1)
date trader_id type
0 1/4/13 Trader_1 Sell
1 13/4/11 Trader_1 Sell
2 4/4/12 Trader_1 Sell
3 3/4/13 Trader_1 Sell
4 2/5/13 Trader_1 Sell
5 9/7/13 Trader_1 Sell
8 5/5/15 Trader_1 Buy
9 5/5/15 Trader_2 Sell
16 29/4/13 Trader_2 Buy
17 30/4/13 Trader_2 Sell
18 22/5/13 Trader_2 Sell